我有簡單的C代碼和輸出出來是不期而至我
main()
{
float f1 = 1.0;
double f2 = 1.0;
if(f1==f2)
printf("Equal");
else
printf("unequal");
}
我期待的結果是「不平等」,但產出是相等的。爲什麼?
由於浮點和雙精度具有不同的精度,輸出應該是不相等的。
我有簡單的C代碼和輸出出來是不期而至我
main()
{
float f1 = 1.0;
double f2 = 1.0;
if(f1==f2)
printf("Equal");
else
printf("unequal");
}
我期待的結果是「不平等」,但產出是相等的。爲什麼?
由於浮點和雙精度具有不同的精度,輸出應該是不相等的。
只有當數字不能準確表示時,精度纔有意義。由於浮點數和雙精度(即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是有,如果你想了解該格式的播放圍繞一個優秀的網站。我非常喜歡它,我製作了一個桌面版本以防萬一它消失了(並且能夠做到雙精度)。
爲什麼它來價值1.1? –
@Amit,這是因爲'1.1'不完全可以表示。它的工作原理是單精度的「1.100000023841858」。 – paxdiablo
這不是類型,它是什麼它比較值,在這種特殊情況下不會發生逼近誤差,因此,這些都是平等的。 Float具有單精度IEEE754格式,double具有雙精度格式,兩種格式的近似值都是相同的,並且不會出現錯誤。你可以取一些不能用float存儲的小數值,然後用你的代碼進行測試。這種比較不應該用真正的代碼完成,因爲溢出和逼近錯誤會意外地分支執行(例如循環中的float比較)。
嘗試做相同的,例如.3
。當基數2表示中的數字是週期性時出現問題。在任何情況下,比較double和/或float都是不正確的,但我想你的問題你已經知道了。
這裏我們再次...在嘗試使用浮點編程之前,請閱讀以下文檔:http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html –
請把它連接到重複的問題 –
@PaulR我問的是有點不同! –