2016-02-26 19 views
4

java.lang.Math文檔說的許多功能,如Math.powjava.lang.Math是否在「ULP內」獨佔或包含?

計算結果必須是內準確結果的1 ulp。

但我一直沒能找到這是什麼意思。它是獨佔的還是包容性的?換句話說,如果精確的結果可以用double表示,那麼返回的值是否包含精確的結果,或者它可能仍然是1 ULP?

例如,我們可以依靠Math.pow(3.0, 2.0) == 9.0嗎?我知道使用平等比較對於雙打來說幾乎總是一個壞主意,所以我主要是出於好奇心,並且當他們做那樣的事時能夠指出人們的錯誤(或讓他們放心)。

回答

6

僅供參考,

實施規範中關注兩個屬性,返回結果的 準確性和方法的單調性的質量。 浮點型數學方法的精度以 ulps單位測量。對於給定的浮點格式,特定實數值的ulp是兩個包含該數值的浮點值之間的距離。當討論 作爲一個整體的方法的準確性而不是在特定的 的論點時,所引用的ulps的數量是針對任何 論點的最差情況誤差。如果一個方法總是有小於0.5 ulps的錯誤,那麼 方法總是返回最接近精確的 結果的浮點數;這種方法正確舍入。正確舍入的方法 通常是最好的浮點近似值;然而, 許多浮點方法正確 四捨五入是不切實際的。

相反,對於Math類,對於某些方法,允許1或2個ulps的誤差範圍較大,爲 。 非正式地,如果確切結果是一個可表示的數字,則有1個ulp錯誤界限, ,應該返回確切結果 作爲計算結果;否則, 中包含精確結果的兩個浮點值中的任一值可能會返回 。

對於量級較大的確切結果,括號中的一個端點可能是無限的。除了在單個參數上的準確性之外,在不同參數 之間保持方法之間的適當關係的 也是重要的。因此,大多數誤差超過0.5 ulp的方法都需要是半單調的:只要數學函數不減少,每當數學函數不增加時,浮點近似也是如此,因此,如此是 的浮點近似。並非所有具有ulp精度的近似值都會自動滿足單調性要求。

Source

+1

哦,我不知道讀書時我是多麼懷念那部分。無論如何,這完全回答了這個問題。我已經編輯了一下。 –