2013-10-02 168 views

回答

7

有效數字的23個小數位(22-0)出現在存儲器格式中,但總精度實際上是24位,因爲我們假設有一個前導1.這相當於log10(2^24) ≈ 7.225十進制數字。

雙精度浮體具有在分數52位,加上前導1是53.因此,一個雙能容納log10(2^53) ≈ 15.955十進制數字,不太16.

注:前導1不是一個符號位。它實際上是(-1)^sign * 1.ffffffff * 2^(eeee-constant),但我們不需要在分數中存儲前導1。符號位仍然必須存儲


有些數字不能表示爲2的冪的總和,如1/9:

>>>> double d = 0.111111111111111; 
>>>> System.out.println(d + "\n" + d*10); 
0.111111111111111 
1.1111111111111098 

如果財政計劃分別做這種計算一遍又一遍地沒有自我糾正,最終會出現差異。

>>>> double d = 0.111111111111111; 
>>>> double sum = 0; 
>>>> for(int i=0; i<1000000000; i++) {sum+=d;} 
>>>> System.out.println(sum); 
111111108.91914201 

經過10億次總結,我們失蹤超過2美元。

+1

前導1不是符號位。它實際上是'(-1)^ sign * 1.ffffffff * 2 ^(eeee-constant)',但我們不需要在分數中存儲前導1。標誌位必須仍然存儲 – Ron

+0

我在某些托盤中看到他們提到了浮動的精度(15 - 16)。 Ever ** 15.955 **將** ** 16 **? –

+3

@ jb_2519正如Ron所示,雙精度浮點數的精度爲15.955 *十進制*位。這意味着你可以很好地依靠前15 *十位*精確的數字,任何後面的數字只能部分表示。就個人而言,我不會依賴任何超過第14位(或第6位的單精度)的十進制數字。 – Corey