Java有浮点基元类型的目的是什么?

2022-09-01 20:51:37

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

我的理解是,将浮点值转换为双精度值可能会出现问题,反之亦然。我读到(很久以前,不确定新的JVM是否真的如此)浮子的性能比双倍的表现差得多。当然,浮子的精度低于双倍。

我还记得,当我使用AWT和Swing时,我在使用浮点数或双精度时遇到了一些问题(例如使用Point2D.Float或Point2D.Double)。

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

  1. 它只需要4个字节,而双倍需要8个字节。

  2. Java 内存模型 (JMM) 保证赋值操作是具有浮点变量的原子操作,而与 double 变量不是原子的。

有没有其他情况,浮点数比双倍更好?您是否在应用程序中使用浮点数?


答案 1

包含浮点型的原因在某种程度上是历史性的:它代表了标准的IEEE浮点表示,从浮点数的大小减少4个字节以换取极差的精度是值得做出的权衡。

如今,浮子的使用非常有限。但是,例如,拥有数据类型可以更轻松地编写需要与使用 float 的旧系统进行互操作的代码。

就性能而言,我认为浮动和双精度除了除除性能外,基本上是相同的。通常,无论您使用哪种方式,处理器都会转换为其内部格式,进行计算,然后再次转换回来,并且实际计算实际上需要固定的时间。在除法的情况下,至少在英特尔处理器上,正如我所记得的那样,进行除法所需的时间通常是每2位精度一个时钟周期,因此,无论您是使用浮点数还是双精度,都会有所不同。

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


答案 2

你刚才给出的这两个理由是巨大的。

如果你有一个1k×1k×64的3D体积,然后有很多时间点的数据,然后想要制作一部最大强度投影的电影,那么浮点大小是两倍的一半,这可能是快速完成和由于内存不足而崩溃之间的区别。

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

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