是否有针对 Java 浮点原语的 IEEE 754 标准实现?
2022-09-04 19:32:21
我感兴趣的是Java是否使用IEEE 754标准来实现它的浮点算术。
IEEE-754 定义了多种浮点类型的标准。多年来,它们都是二元浮点;这就是Java和:是一个32位IEEE-754二进制浮点值(标准称之为binary32
)。 是一个64位的(标准称之为二进制64
)。这些二进制浮点数对于计算机计算非常有效,但是因为它们以二进制工作并且我们以十进制工作,因此存在一些期望不匹配;例如,不能精确地存储在 一个 中,并且您会得到奇怪的事情,例如事实证明是 。有关详细信息,请参阅浮点数学是否损坏?。例如,它们不是财务计算的好选择。float
double
float
double
0.1
double
0.1 + 0.2
0.30000000000000004
BigDecimal
是一个 Java 类,它以任意精度实现十进制小数。它比使用慢得多,但结果符合我们十进制的期望(例如,这将是 )。double
0.1 + 0.2
0.3
2008 版 IEEE-754 增加了重要的新格式,特别是 decimal32
、decimal64
和 decimal128
。这些是十进制浮点数,因此它们的工作方式与我们的工作方式相同。 可以准确地存储在. 位于 中。但是,据我所知,它们与您的问题并不相关。0.1
decimal64
0.1 + 0.2
0.3
decimal64
由于早于IEEE-754 2008(略微),因此它定义了自己的语义。BigDecimal
如果不是比在数学课上使用IEEE 754标准有什么意义?
JDK9 添加了新的操作,用于执行 IEEE-754 2008 规范定义的事情(例如 fma
,它执行融合乘加),因此为了清楚起见,它参考 IEEE-754 2008 规范定义了这些操作。Math
更多阅读: