2016-10-28 73 views
7

我很感兴趣,如果Java使用IEEE 754标准来实现其浮点运算。 Here我看到这种事情在文档:在IEEE 754-2008Java浮点基元有没有任何IEEE 754标准实现?

定义据我了解IEEE 754的积极的一面是增加浮点算术的精度

操作,所以如果我要在Java中使用doublefloat将计算预设与BigDecimal相同?如果不是在Math类中使用IEEE 754标准有什么意义?

回答

8

我很感兴趣,如果Java使用IEEE 754标准来实现它的浮点运算。

IEEE-754定义了标准多个浮点类型。多年来,他们都是二进制浮点;这就是Java的floatdouble是: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,decimal64decimal128。这些是十进制浮点数,所以它们的工作方式与我们所做的相同。 0.1可以准确存储在decimal640.1 + 0.20.3decimal64。然而,据我所知,它们与你的问题并不真正相关。

由于BigDecimal早于IEEE-754 2008(按某种边缘),它定义了它自己的语义。

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

JDK9增加了新的操作,以Math那些由IEEE-754 2008规范(如fma,其中做了fused multiply-add)中所定义的东西,所以它定义参照IEEE-754 2008规格的那些操作,为清楚起见。

更多读数:

+0

挑剔:约754-2008 IEEE,其中,除了二进制浮点类型,定义了十进制浮点提问者询问点类型'decimal64'和'decimal128',它们能够精确地表示'0.1'。 – njuffa

+0

@njuffa:好点,我错过了在问题的引用位。盲目的链接是JDK9规范谈论2008年的标准。这完全改变了答案。 –

+0

@njuffa:已修复,并再次感谢您指出。 –

相关问题