上学期我们不得不为学校的一门类(class)开发光线追踪器。学校快结束了,我试着摆弄一下。我想看看如果我将所有浮点计算从double更改为float(所有计算均使用double完成)会发生什么变化。所以我将每个变量都更改为float类型,并将Math方法返回的每个double简单地转换为float。在几个场景上测试我的光线追踪器显示出相当不错的性能提升。在网络上搜索后,我发现了float可以更快的各种原因,但也有人说double可以同样快,甚至在64位环境中更快。问题是,我在64位环境和JVM中运行。性能提高的原因是什么?现在,我正在阅读PBRT书籍,并计划在此之后从头开始重写光线追踪
这个问题在这里已经有了答案:Whentousewrapperclassandprimitivetype(11个答案)关闭9年前。我的同事告诉我,我应该尽可能使用float来减少对象创建并提高性能。必要时,Java会自动将float转换为Float(这需要一些计算能力)。所以在我看来,唯一需要Float的是需要经常使用对象Float而不是它的原始对象。当查看java.awt.Color时,它正在使用Float,这可能是不必要的。在Java中什么时候需要使用Float而不是float?
为什么0x1p3等于8.0?为什么0x1e3等于483,而0x1e3d等于7741?这是令人困惑的,因为1e3d等于1000.0。 最佳答案 0x1e3和0x1e3d是十六进制的integer文字。注意e和d是十六进制数字,不是指数指示器或double在这种情况下输入指示符。1e3d是十进制的float文字。e是指数指标,d说这是一个double而不是float.符号0x1p3是一种用十六进制表示浮点文字的方法,您可以在section3.10.2中读到Java语言规范。表示1乘以2的3次方;指数是二进制的(因此,它是2的幂而不是10
RoundingMode允许程序员指定float的舍入方式。这一切都很棒,但我发现其中有一件事很奇怪。也许我只是误解了学校的一些基本知识。但是这个舍入模式被描述为我在学校教的那个,“总是四舍五入到最接近的数字,当死在中心时,总是向上舍入。”,但为什么它会从-2.5舍入到-3?我的结论是,它根据绝对值四舍五入,但对我来说,-2肯定是-2.5的“向上”。 最佳答案 RoundingMode.UP是“远离零”的舍入模式。RoundingMode.FLOOR朝向负无穷大,CEILING朝向正无穷大。HALF_UP在小数部分恰好为0.5时与U
在某些情况下,我需要将字符串转换为float或其他一些数字数据类型,但有可能得到一些不可转换的值,例如“-”或“/”,我无法验证所有值事先删除它们。我想避免在这件事上使用try/catch,有没有其他方法可以在java中进行正确的转换?类似于C#TryParse的东西? 最佳答案 我能想到的最简单的事情是java.util.Scanner。然而,这种方法需要为每个字符串创建一个新的Scanner实例。Stringdata=...;Scannern=newScanner(data);if(n.hasNextInt()){//check
我试过了System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY))System.out.println(Double.isInfinite(Float.NEGATIVE_INFINITY));输出是truetrue所以这意味着“无限”对于两种数据类型是相同的? 最佳答案 是也不是。是的,因为在抽象意义上无限就是无限(而且,正如我在下面解释的那样,出于大多数代码的目的,float无论如何都会转换为double)。但是,不是,因为在位级别上,这两个无穷大是不同的。Java
这个问题在这里已经有了答案:printfhowtodofloatingpointswithleadingzeros(3个答案)关闭7年前。为什么System.out.format("%03.3f",1.23456789);打印1.235而不是001.235?我的format字符串如何看起来像得到001.235作为以下代码行的输出?System.out.format(format,1.23456789);
有一种简单的方法可以完全锁定大量JVM:classrunhang{publicstaticvoidmain(String[]args){System.out.println("Test:");doubled=Double.parseDouble("2.2250738585072012e-308");System.out.println("Value:"+d);}}或者,挂起编译器:classcompilehang{publicstaticvoidmain(String[]args){doubled=2.2250738585072012e-308;System.out.println("
我最近阅读了很多关于浮点表示的内容(包括:HowToRepresent0.1InFloatingPointArithmeticAndDecimal)。现在我明白0.1不能正确表示,当我这样做时:System.out.println(2.0f-1.9f);我永远得不到准确的结果。所以问题是:为了正确打印0.1,如何在以下代码中表示0.1f?那是某种合成糖吗?在我上面提到的文章中说:0.1在内存中表示为0.100000001490116119384765625。那么为什么我没有得到这段代码的输出:System.out.println(0.1f);Java如何处理这个问题?
这里有几个相关的问题。根据标题,如果我们将变量类型指定为long或float、double,为什么它是一个要求?编译器不会在编译时评估变量的类型吗?Java将所有整型文字视为int-这是为了减轻无意内存浪费的影响吗?所有浮点文字都是double-以确保最高精度? 最佳答案 当你有一个常量时,看起来相同但实际上不同的值之间存在细微差别。此外,由于引入了自动装箱,您会得到与less截然不同的结果。考虑将0.1乘以0.1作为float或double并转换为float会得到什么。floata=(float)(0.1*0.1);floatb=