你能帮我澄清一下Java中float原语的用法吗?
我的理解是将浮点值转换为double,反之亦然可能会有问题。我读过(很久很久以前并且不确定新的JVM是否真的存在),浮动的性能比双重性差得多。当然浮标的精度低于双精度。
我还记得当我使用AWT和Swing时,我在使用float或double时遇到了一些问题(比如使用Point2D.Float或Point2D.Double)。
所以,我看到浮动超过双重的两个优点:
它只需要4个字节,而double需要8个字节
Java内存模型(JMM)保证赋值操作是浮点变量的原子,而不是double的原子。
还有其他情况,浮动比双重更好吗?你在应用程序中使用float吗?
答案 0 :(得分:15)
包含浮点类型的原因在某种程度上是历史性的:它表示标准的IEEE浮点表示,从削减浮点数大小4个字节的日子开始,以换取极差的精度是值得做出的权衡
如今,浮动的用途非常有限。但是,例如,拥有数据类型可以更容易地编写需要与使用float的旧系统进行互操作的代码。
就性能而言,我认为浮动和双重基本相同除了划分的表现。通常,无论您使用哪种方式,处理器都会转换为内部格式,进行计算,然后再转换回来,实际计算有效地需要一段固定的时间。在划分的情况下,至少在Intel处理器上,我记得进行除法所花费的时间通常是每2位精度一个时钟周期,因此无论你使用float还是double都会产生影响。
除非你真的有充分的理由使用它,否则在新代码中,我通常会避免'浮动'。
答案 1 :(得分:7)
你刚才给出的两个原因是巨大的。
如果你的3D体积是1k×1k×64,然后有很多这些数据的时间点,然后想制作一个最大强度投影的电影,那么浮点数是double的一半的事实可能是快速完成和颠簸之间的区别,因为你的内存不足。
从线程的角度来看,原子性也是巨大的。
速度/性能和准确性之间总会存在权衡。如果你的数字小于2 ^ 31且是一个整数,那么整数总是比浮点数更好地表示这个数字,只是因为精度损失。您必须评估您的需求,并针对您的问题使用适当的类型。
答案 2 :(得分:3)
我认为当你提到存储时,你会把它钉在上面,浮动尺寸是它的一半。
对于处理大型浮点数阵列的应用程序,使用浮点数可能会显示出比双精度更高的性能,因此内存带宽是限制因素。通过从float[]
切换到double[]
并将数据大小减半,可以有效地使吞吐量加倍,因为在给定时间内可以获取两倍的值。虽然cpu还有一些工作要做,但是将float转换为double,这与内存提取并行,并且获取时间更长。
对于某些应用,精度损失可能值得交易以获得性能提升。然后......: - )
答案 3 :(得分:2)
是的,浮动的优点:
使用双打时缓解这些的方法:
其他人提到这与short vs int参数类似,但事实并非如此。除long存储的所有整数类型(包括布尔值)都存储为Java内存模型中的4字节整数,除非存储在数组中。
答案 4 :(得分:2)
在某些情况下,双打可能比浮点数更快。但是,这要求所有内容都适合L1缓存。使用浮动,您可以在缓存行中使用两倍。这可以使一些程序的运行速度快几倍。
SSE指令也可以并行使用4个浮点数而不是2个浮点数,但我怀疑JIT实际上是使用它们。我可能错了。