是否有针对 Java 浮点原语的 IEEE 754 标准实现?

我对Java是否使用IEEE 754标准来实现其浮点算术感兴趣。这里我在文档中看到了这样的事情:

IEEE 754-2008 中定义的操作

据我所知,IEEE 754的积极方面是提高浮点算术的精度,因此,如果我使用或在Java中,计算的预设是否与?如果不是比在数学课上使用IEEE 754标准有什么意义?doublefloatBigDecimal


答案 1

我感兴趣的是Java是否使用IEEE 754标准来实现它的浮点算术。

IEEE-754 定义了多种浮点类型的标准。多年来,它们都是二元浮点;这就是Java和:是一个32位IEEE-754二进制浮点值(标准称之为binary32)。 是一个64位的(标准称之为二进制64)。这些二进制浮点数对于计算机计算非常有效,但是因为它们以二进制工作并且我们以十进制工作,因此存在一些期望不匹配;例如,不能精确地存储在 一个 中,并且您会得到奇怪的事情,例如事实证明是 。有关详细信息,请参阅浮点数学是否损坏?。例如,它们不是财务计算的好选择。floatdoublefloatdouble0.1double0.1 + 0.20.30000000000000004

BigDecimal是一个 Java 类,它以任意精度实现十进制小数。它比使用慢得多,但结果符合我们十进制的期望(例如,这将是 )。double0.1 + 0.20.3

2008 版 IEEE-754 增加了重要的新格式,特别是 decimal32decimal64decimal128。这些是十进制浮点数,因此它们的工作方式与我们的工作方式相同。 可以准确地存储在. 位于 中。但是,据我所知,它们与您的问题并不相关。0.1decimal640.1 + 0.20.3decimal64

由于早于IEEE-754 2008(略微),因此它定义了自己的语义。BigDecimal

如果不是比在数学课上使用IEEE 754标准有什么意义?

JDK9 添加了新的操作,用于执行 IEEE-754 2008 规范定义的事情(例如 fma,它执行融合乘加),因此为了清楚起见,它参考 IEEE-754 2008 规范定义了这些操作。Math

更多阅读:


答案 2