你能帮我澄清Java中浮点原语的用法吗?
我的理解是,将浮点数转换成双倍值,反之亦然,这是有问题的。我读到(很久以前,并且不确定新JVM是否真的是真的),浮动的性能比double差得多,当然浮动的精度比double低。
我还记得,当我使用AWT和Swing时,我在使用float或double (比如使用Point2D.Float或Point2D.Double)时遇到了一些问题。
因此,我只看到浮动比双倍的两个优点:
的原子操作。
还有其他比双倍更好的情况吗?您在应用程序中使用浮动吗?
发布于 2010-04-28 22:38:30
包含浮点数类型的原因在某种程度上是历史性的:它代表了标准IEEE浮点表示形式,而在那些日子里,为了换取极低的精度而将一个浮点数的大小减少4个字节是一种值得做出的权衡。
现在,浮子的使用是相当有限的。但是,例如,拥有数据类型可以更容易地编写需要与使用float的旧系统的互操作性的代码。
就性能而言,我认为float和double本质上是相同的,除以除法的性能外。通常,无论您使用哪种处理器,处理器都会将其转换为内部格式,进行计算,然后再进行转换,而实际的计算实际上需要固定的时间。在除法方面,至少在Intel处理器上,我记得做一个除法所需的时间通常是每2位精度一个时钟周期,所以不管您是使用浮点数还是双倍,都会产生不同的效果。
除非您确实有充分的理由使用它,否则在新代码中,我通常会避免使用“float”。
发布于 2010-04-28 22:31:16
你刚才说的两个理由是很重要的。
如果你有一个1k乘1k乘64的3D卷,然后有很多数据的时点,然后想要拍摄一部最大强度投影的电影,那么浮子的尺寸是双倍的一半,这可能是快速完成和因内存不足而被击打的区别。
从线程的角度来看,原子性也是巨大的。
在速度/性能和准确性之间总是会有一种权衡。如果您有一个小于2^31的数字和一个整数,那么由于精度损失,整数总是比浮点数更好地表示该数字。您必须评估您的需求,并为您的问题使用适当的类型。
发布于 2010-04-28 22:37:18
我想你提到储藏室的时候就把它钉死了,浮子的尺寸只有一半。
对于处理大量浮点数数组的应用程序来说,使用浮点数可能会在双倍以上显示更好的性能,因此内存带带是限制因素。通过从float[]切换到double[]并将数据大小减半,可以有效地将吞吐量提高一倍,因为可以在给定的时间内获取两倍多的值。虽然cpu还有一些工作要做,将浮点转换成双倍,但这与内存提取并行进行,而提取所用的时间更长。
对于某些应用程序来说,精度的损失可能是值得的,以换取性能的提高。再说一次..。:-)
https://stackoverflow.com/questions/2733479
复制相似问题