首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java有一个浮点基元类型是为了什么目的?

java有一个浮点基元类型是为了什么目的?
EN

Stack Overflow用户
提问于 2010-04-28 22:14:47
回答 5查看 10.3K关注 0票数 24

你能帮我澄清Java中浮点原语的用法吗?

我的理解是,将浮点数转换成双倍值,反之亦然,这是有问题的。我读到(很久以前,并且不确定新JVM是否真的是真的),浮动的性能比double差得多,当然浮动的精度比double低。

我还记得,当我使用AWT和Swing时,我在使用float或double (比如使用Point2D.Float或Point2D.Double)时遇到了一些问题。

因此,我只看到浮动比双倍的两个优点:

  1. 它只需要4个字节,而double需要8个字节
  2. Java内存模型(JMM)保证赋值操作是带有浮点变量的原子操作,而不是对double的.

的原子操作。

还有其他比双倍更好的情况吗?您在应用程序中使用浮动吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-28 22:38:30

包含浮点数类型的原因在某种程度上是历史性的:它代表了标准IEEE浮点表示形式,而在那些日子里,为了换取极低的精度而将一个浮点数的大小减少4个字节是一种值得做出的权衡。

现在,浮子的使用是相当有限的。但是,例如,拥有数据类型可以更容易地编写需要与使用float的旧系统的互操作性的代码。

就性能而言,我认为float和double本质上是相同的,除以除法的性能外。通常,无论您使用哪种处理器,处理器都会将其转换为内部格式,进行计算,然后再进行转换,而实际的计算实际上需要固定的时间。在除法方面,至少在Intel处理器上,我记得做一个除法所需的时间通常是每2位精度一个时钟周期,所以不管您是使用浮点数还是双倍,都会产生不同的效果。

除非您确实有充分的理由使用它,否则在新代码中,我通常会避免使用“float”。

票数 16
EN

Stack Overflow用户

发布于 2010-04-28 22:31:16

你刚才说的两个理由是很重要的。

如果你有一个1k乘1k乘64的3D卷,然后有很多数据的时点,然后想要拍摄一部最大强度投影的电影,那么浮子的尺寸是双倍的一半,这可能是快速完成和因内存不足而被击打的区别。

从线程的角度来看,原子性也是巨大的。

在速度/性能和准确性之间总是会有一种权衡。如果您有一个小于2^31的数字和一个整数,那么由于精度损失,整数总是比浮点数更好地表示该数字。您必须评估您的需求,并为您的问题使用适当的类型。

票数 8
EN

Stack Overflow用户

发布于 2010-04-28 22:37:18

我想你提到储藏室的时候就把它钉死了,浮子的尺寸只有一半。

对于处理大量浮点数数组的应用程序来说,使用浮点数可能会在双倍以上显示更好的性能,因此内存带带是限制因素。通过从float[]切换到double[]并将数据大小减半,可以有效地将吞吐量提高一倍,因为可以在给定的时间内获取两倍多的值。虽然cpu还有一些工作要做,将浮点转换成双倍,但这与内存提取并行进行,而提取所用的时间更长。

对于某些应用程序来说,精度的损失可能是值得的,以换取性能的提高。再说一次..。:-)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2733479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档