2016-10-28 74 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:已修復,並再次感謝您指出。 –

相關問題