2011-10-12 15 views
0

可能重複:
Floating point comparison它是不是C PROGRAME的右輸出

我有簡單的C代碼和輸出出來是不期而至我

main() 

{ 

    float f1 = 1.0; 

    double f2 = 1.0; 

    if(f1==f2) 

printf("Equal"); 

else 

    printf("unequal"); 

    } 

我期待的結果是「不平等」,但產出是相等的。爲什麼?

由於浮點和雙精度具有不同的精度,輸出應該是不相等的。

+3

這裏我們再次...在嘗試使用浮點編程之前,請閱讀以下文檔:http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html –

+0

請把它連接到重複的問題 –

+0

@PaulR我問的是有點不同! –

回答

8

只有當數字不能準確表示時,精度纔有意義。由於浮點數和雙精度(即IEEE 754單精度值和雙精度值)都可以精確地表示1.0,因此精度不會達到精度。

1.0基本上是零符號位,除了最高設置爲1的所有指數位,並沒有設定尾數位。在單精度,這是二進制:

0-01111111-00000000000000000000000 

和雙精度:

0-01111111111-0000000000000000000000000000000000000000000000000000 

並非所有的數字是精確表示在IEEE 754 - 例如,1.1你在評論提到實際上存儲爲單精度的1.100000023841858

看一看this answer爲浮點值進行解碼的示例。

Harald Schmidt's online single-precision converter是有,如果你想了解該格式的播放圍繞一個優秀的網站。我非常喜歡它,我製作了一個桌面版本以防萬一它消失了(並且能夠做到雙精度)。

+0

爲什麼它來價值1.1? –

+0

@Amit,這是因爲'1.1'不完全可以表示。它的工作原理是單精度的「1.100000023841858」。 – paxdiablo

2

這不是類型,它是什麼它比較值,在這種特殊情況下不會發生逼近誤差,因此,這些都是平等的。 Float具有單精度IEEE754格式,double具有雙精度格式,兩種格式的近似值都是相同的,並且不會出現錯誤。你可以取一些不能用float存儲的小數值,然後用你的代碼進行測試。這種比較不應該用真正的代碼完成,因爲溢出和逼近錯誤會意外地分支執行(例如循環中的float比較)。

1

嘗試做相同的,例如.3。當基數2表示中的數字是週期性時出現問題。在任何情況下,比較double和/或float都是不正確的,但我想你的問題你已經知道了。