2012-08-23 97 views
5

我正在開發一個在Linux環境下運行的C++應用程序。我需要存儲6個deciaml地方的大值。我用了一個雙倍的。但分配後,雙變量不包含確切的值。它已經圓滿了。雙精度丟失C++

例:

double dValue = 79447461534242.913072; //Assignement of value 

但在那之後,當我在dValue看到的價值它是像79447461534242.906

有一個人可以讓我知道爲什麼發生這種情況,建議我正確的數據類型它可以保持準確的數值而不會失去精度。

+2

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –

+0

不要忘了接受你最喜歡的答案;) –

回答

5

在一個典型的實現中,double具有約15位精度。它們在小數點之前還是之後無關緊要,總共只有15位數字。

就您的情況而言,原始數字大約爲20位數,因此五個數字立即丟失。

+0

你肯定在*總共15位精度*?至少在Javascript整數精度是準確的......但我不確定這是否是JavaScript獨有的東西。 –

+1

@MarcusRiemer:整數類型在C++中也是精確的;但是這個問題是關於浮點類型的。 –

+0

@MarcusRiemer:'double'和integer是兩種完全不同的動物。雖然「高級」語言通常支持任意的精度整數,但C++通常使用硬件提供的內容來實現 - 通常爲16位,32位爲int,32位或64位長,64位長。 'double'通常是一個具有53位尾數的64位浮點類型。 –

5

C++使用僅在一定程度上精確到某一程度的IEEE浮點類型設計。如果您需要任意精度,請查看例如GNU MP Bignum或任何其他任意的任意精度庫。

2

most commonly used double precision format存儲53位精度的數字。這給出了大約16個十進制數字的精度。

您可能會發現long double可提供更高的精度,但不能保證該值大於double

如果您需要比本地機器類型更高的精度,則需要高精度數字庫,例如GMP

1

在linux上,您可以使用__float128這是一個四倍精度浮點類型。

+0

假設你有gcc> 4.6 –

+0

我無法用__float28編譯它。它給出錯誤'__float128'未在此範圍內聲明 – user1308004

+0

您使用的是gcc的哪個版本?輸入'gcc --version' –