我感兴趣的是Java是否使用IEEE 754标准来实现它的浮点算法。这里 --我在文档中看到了这样的事情:
IEEE 754-2008中定义的操作
据我所知,IEEE754的积极一面是提高浮点算法的精度,所以如果我在Java中使用double
或float
,计算的可能性是否与BigDecimal
相同?如果不是,那么在Math
类中使用IEEE754标准有什么意义呢?
发布于 2016-10-28 07:25:57
我感兴趣的是Java是否使用IEEE 754标准来实现它的浮点算法。
IEEE-754定义了多种浮点类型的标准。多年来,它们都是二进制浮点;这就是Java的float
和double
的特点:float
是32位IEEE-754二进制浮点值(标准称为binary32
)。double
是64位的(标准称为binary64
)。对于计算机来说,这些二进制浮点数非常有效,但是因为它们是二进制的,而我们是十进制的,所以有一些期望不匹配的地方;例如,0.1
不能精确地存储在double
中,你会发现像0.1 + 0.2
这样的奇怪的东西变成了0.30000000000000004
。详情请参见https://stackoverflow.com/questions/588004/is-floating-point-math-broken。例如,对于财务计算来说,它们不是一个好选择。
BigDecimal
是一个Java类,它实现具有任意精度的小数小数。它比使用double
慢得多,但结果符合我们十进制的预期(例如,0.1 + 0.2
将是0.3
)。
IEEE-754的2008年版增加了重要的新格式,特别是decimal32
、decimal64
和decimal128
。这些是十进制浮点数,所以它们的工作方式和我们一样。0.1
可以准确地存储在decimal64
中。0.1 + 0.2
是0.3
in decimal64
。然而,据我所知,它们与你的问题并没有真正的关系。
由于BigDecimal
早于IEEE-754 2008 (在某种程度上),它定义了自己的语义。
如果不是,在数学类中使用IEEE 754标准有什么意义?
JDK9为Math
添加了新的操作,这些操作可以执行IEEE-754 2008规范定义的事情(比如fma
,它可以执行融合相加),因此为了清晰起见,它参照IEEE-754 2008规范定义了这些操作。
更多阅读:
https://stackoverflow.com/questions/40300041
复制相似问题