2012-06-19 78 views
-1

使用long double我得到18/19 = 0.947368421052631578...,947368421052631578是重複小數。使用double我得到0.947368421052631526...但是,前者是正確的。爲什麼這樣的結果不正確?double和precision

感謝您的幫助。

+6

讓我重新解釋一下你的問題:你很驚訝「長雙倍」比「雙倍」更精確? – raina77ow

回答

7

A double通常提供16(±1)個十進制數字。您的示例顯示了這一點:

 4 8 12 16 
    v v v v 
0.947368421052631578 long double 
0.947368421052631526 double 

答案同意爲16位數字。這是應該預料的。另請注意,C標準中沒有保證long doubledouble更精確。

8

您試圖用有限的位數表示每個十進制數。有些東西不能完全以浮點形式表達。期待與浮游物確切的答案是你的第一個問題。看看What Every Computer Scientist Should Know About Floating-Point Arithmetic

這裏有一個總結,從some lecture notes

正如前面提到的,計算機不能精確代表實數,因爲有位用於存儲實數只有有限數量。因此,任何具有無限數字的數字如1/3,2的平方根和PI都不能完全表示。而且,由於編碼實數的方式,即使是有限數量的數字也不能精確表示。

6

double甲其通常與IEEE 754實現將是準確的,以15和17之間的十進制數字。即使你可以讓編譯器顯示它,任何過去都不可信的東西。