我很感兴趣,如果Java使用IEEE 754标准来实现其浮点运算。 Here我看到这种事情在文档:在IEEE 754-2008Java浮点基元有没有任何IEEE 754标准实现?
定义据我了解IEEE 754的积极的一面是增加浮点算术的精度
操作,所以如果我要在Java中使用
double
或float
将计算预设与BigDecimal
相同?如果不是在Math
类中使用IEEE 754标准有什么意义?
我很感兴趣,如果Java使用IEEE 754标准来实现其浮点运算。 Here我看到这种事情在文档:在IEEE 754-2008Java浮点基元有没有任何IEEE 754标准实现?
定义据我了解IEEE 754的积极的一面是增加浮点算术的精度
操作,所以如果我要在Java中使用
double
或float
将计算预设与BigDecimal
相同?如果不是在Math
类中使用IEEE 754标准有什么意义?
我很感兴趣,如果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
。详情请参阅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
的decimal64
。然而,据我所知,它们与你的问题并不真正相关。
由于BigDecimal
早于IEEE-754 2008(按某种边缘),它定义了它自己的语义。
如果不是在数学课程中使用IEEE 754标准有什么意义?
JDK9增加了新的操作,以Math
那些由IEEE-754 2008规范(如fma
,其中做了fused multiply-add)中所定义的东西,所以它定义参照IEEE-754 2008规格的那些操作,为清楚起见。
更多读数:
挑剔:约754-2008 IEEE,其中,除了二进制浮点类型,定义了十进制浮点提问者询问点类型'decimal64'和'decimal128',它们能够精确地表示'0.1'。 – njuffa
@njuffa:好点,我错过了在问题的引用位。盲目的链接是JDK9规范谈论2008年的标准。这完全改变了答案。 –
@njuffa:已修复,并再次感谢您指出。 –