2015-01-09 26 views
-1

的分配和產值我很新的節目,所以,如果我不使用精確的術語來表達,請原諒..差在雙

我在不同的嘗試輸出的雙重價值值,但當我試圖做下面的值改變任何人都可以解釋爲什麼會發生這種情況。

在程序中,

int main() 
{ 
// double i=555555.555555;    //--------------------------------(A) 
// double i=5555555555555555.555555; //--------------------------------(B) 
// double i=555555555555555.555555; //--------------------------------(C) 

    printf("%f",i); 
    printf("\n%lf",i); 

    return 0; 
} 

輸出爲

line (A): 
555555.555555 
555555.555555 

line (B): 
555555555555555.560000 
555555555555555.560000 

line (C): 
5555555555555556.000000 
5555555555555556.000000 

在上文中,如果我線(A)編譯,我會得到一個正確的輸出。但是,如果我嘗試行(B)和(C),輸出會變化,並且在行(C)中,值id完全更改。

請幫我這混亂..

在此先感謝..

+0

剛纔看了這樣的:http://floating-point-gui.de –

回答

2

浮點十進制值通常沒有一個確切的二進制表示。這是CPU如何表示浮點數據的副作用。出於這個原因,您可能會遇到某些精度損失,並且某些浮點運算可能會產生意想不到的結果。

此行爲是下列中的一個的結果:

  1. 十進制數的二進制表示可能不準確。
  2. 所用數字之間存在類型不匹配(例如, 混合float和double)。

要解決此問題,大多數程序員要麼確保該值大於或小於所需值,要麼使用二進制編碼的十進制(BCD)庫來保持精度。 浮點值的二進制表示會影響浮點計算的精度和準確性。

來自:Why Floating point number loose precision

+0

人們確實使用任意精度或多精度像GMP庫(https://gmplib.org/) ,但他們並不經常使用BCD。相關的概念,但不一樣。 –