我对 Java 是否使用 IEEE 754 标准来实现其浮点运算感兴趣。 Here我在文档中看到了这种东西:
operation defined in IEEE 754-2008
据我所知,IEEE 754 的积极方面是提高浮点运算的精度,因此如果我在 Java 中使用 double
或 float
,计算的精度将相同和 BigDecimal
一样吗?如果不是,那么在 Math
中使用 IEEE 754 标准有什么意义呢?类(class)?
最佳答案
I'm interested if Java is using IEEE 754 standard for implementing it's floating point arithmetic.
IEEE-754 定义了多个 浮点类型的标准。多年来,它们都是二进制 float ;这就是 Java 的 float
和 double
是:float
是一个 32 位 IEEE-754 二进制浮点值(标准称为 binary32
). double
是 64 位的(标准称为 binary64
)。这些二进制 float 对于计算机来说计算效率很高,但是因为它们以二进制工作而我们以十进制工作,所以存在一些期望不匹配;例如,0.1
不能精确地存储在 double
中,您会得到像 0.1 + 0.2
这样的奇怪结果,结果是 0.30000000000000004
。参见 Is floating point math broken?了解详情。例如,它们不是财务计算的好选择。
BigDecimal
是一个 Java 类,它以任意精度实现 decimal 小数。它比使用 double
慢得多,但结果符合我们对小数的期望(例如,0.1 + 0.2
将是 0.3
) .
IEEE-754 的 2008 版增加了重要的新格式,特别是 decimal32
, decimal64
, 和 decimal128
.这些是十进制 float ,因此它们的工作方式与我们相同。 0.1
可以准确的存储在一个decimal64
中。 0.1 + 0.2
在 decimal64
中是 0.3
。但是,据我所知,它们与您的问题并不相关。
由于 BigDecimal
早于 IEEE-754 2008(在一定程度上),它定义了自己的语义。
And if not than what's the point of using IEEE 754 standard in Math class?
JDK9 向 Math
添加了新的操作,这些操作执行 IEEE-754 2008 规范定义的操作(例如 fma
,它执行 fused multiply-add ),因此它通过引用定义了这些操作为清楚起见,符合 IEEE-754 2008 规范。
更多阅读:
关于java - Java 浮点基元是否有任何 IEEE 754 标准实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40300041/