2011-08-24 34 views
4

如都知道decimal fractions(如0.1),當作爲存儲floating point(如雙或浮動)將在內部中的「二進制格式」(IEEE 754)表示。而一些小數不能直接用二進制格式表示。浮點運算=從十二進制到二進制最差的精度/差異是多少?

我沒有理解什麼是這種「轉換」的精度:

1)浮點本身可以​​有一個精度(即是「顯著」)?

2.)但是從小數部分到二進制部分的轉換也有精度損失?

問:

是什麼(對於「所有」可能的小數)從小數轉換爲浮點分數時,最壞的情況下精度損失?

(我想知道這種情況的原因是,比較二進制/浮點分數小數時,我需要精確到...,以確定這兩個數字都相同的。而且我想這個精度是緊/精確儘可能(decimal fraction == binary fraction +/- precision)

實施例(只是假設)

0,1 dec => 0,10000001212121212121212 (binary fraction double) => precision loss 0,00000001212121212121212 
0,3 dec => 0,300000282828282 (binary fraction double) => precision loss 0,000000282828282 
+0

這是絕對差異還是百分比差距?您的示例顯示了絕對差異,但在某些情況下可能更有意義找到最大差異情況。 –

+0

你好德蘭,非常好點。也許百分比精確度損失會更相關? – Markus

+1

請避免多個問號。一個就足夠了。 –

回答

4

這是不完全清楚,我你是什麼後,但你可能有興趣在下面的文件,其中討論了許多參與二進制/十進制轉換,包括疑難案件清單的準確性問題。

韋恩帕克森和威廉Kahan的。 用於測試IEEE十進制二進制轉換的程序。 1991年5月22日 http://www.icir.org/vern/papers/testbase-report.pdf

3

浮點將變得越來越不準確的較大它得到(無論是在正方向和負方向),這是因爲浮點值是一個指數ial格式。

然而,小數將變得越來越精確,它使用了更多的小數位,無論它是多麼大。

因此,最壞的精度差別將是朝着你使用任何浮點類型的數值範圍。

1

由於方式教導我們來算當孩子,也難以充分領略二進制小數的精度特性。問題在於一小部分只能依據計票系統的力量。這似乎很明顯,但基本問題是十進制將事物分成幾十個,而二進制將事物分成兩半(一半)。

大多數情況下,您有兩次需要計算浮點值:何時是貨幣值,何時不是。後者的範圍可以從旋轉軸上的編碼器的輸入到虛擬空間中的位置以交付給圖形引擎。小數值在二進制中沒有問題,因爲它確實是一個小數值。這是FPU多年前爲3D圖形普及的部分原因。

問題附帶表示貨幣其中分數部分實際上是不連續的十進制單元。在現實世界中,您可以有0.01美元(取決於哪個美元!),但這很難用二進制準確表示。這就是爲什麼你不應該使用二進制浮點的貨幣。

如果您要在十進制和二進制浮點之間進行轉換並嘗試進行比較,那麼我會查看爲什麼要進行轉換以及比較應該實現哪些比較。

+1

不幸的是,這個問題在浮點上更糟糕。您通常有一個符號* base ^指數格式,所有格式都是二進制格式。 – Arafangion

1

前提是十進制值落入表示的浮點值的範圍,以及你的語言/實施有正確全面的轉換(許多人,有的沒有),從錯誤這種轉換受到連續浮點數之間距離的1/2的限制,或「ulp」(最後一個單位)。

相對大小的ulp是2的精確功率和下一個較大的數目,所以十進制和雙之間的轉換的最大相對誤差之間最大實現當輸入爲剛好小於1 + 1/2 ulp,或該值按2的冪次縮放。這樣一個值的例子是:

1.0000000000000001110223024625156540423631668090820312 

(這幾乎是無限小於1 + 2^-53)。

由於來自轉換的誤差具有相對的界限,所以當我們將這個值以2的冪進行縮放時,誤差會變大,顯然。

當然,如果一個數落入表示的值的範圍之外(無論是通過被過大或過小),則所有的精度丟失。轉化,說1e400double收益率infinity;沒有我們實際投入的痕跡。同樣,將1e-400轉換爲double也會產生零。

0

數量變得越大,精度越高損失可以(但也可能是您的準確數字,其中指定)。

你不僅非常小的數字存儲在Java作爲浮動或雙,但非常大的數字,太像9 * 10^105。

而且我想這個精度是緊/精確地

您可以選擇的BigDecimal,在那裏你可以指定你想怎麼精確得到,當然你以某種方式限制通過RAM,按CPU時間,按JVM的限制。

你只關心絕對精度,還是在相對精度?

比較精度的差異:

a = 100000000000000,0000000000000001 
b = 100000000000000,0000000000000002 

layoutHonkyTonkA= 0,0000000000000001 
layoutHonkyTonkB= 0,0000000000000002 

的絕對精度差是相同的,但相對精度差別是很大的不同。