我計算出下面的代碼並得到了一個奇怪的結果。任何人都可以解釋它如何工作?浮點值條件
main()
{
float a=0.8;
float b=0.25;
if(a==0.8)
printf("HELLO")
if(b==0.25)
printf("WORLD")
}
而且,我得到的輸出是令人驚訝的
WORLD
由於事先
我計算出下面的代碼並得到了一個奇怪的結果。任何人都可以解釋它如何工作?浮點值條件
main()
{
float a=0.8;
float b=0.25;
if(a==0.8)
printf("HELLO")
if(b==0.25)
printf("WORLD")
}
而且,我得到的輸出是令人驚訝的
WORLD
由於事先
這是因爲0.25是2的冪(即2^-2),而0.8是不。只能精確地表示兩個冪的精確總和;所有其他數字(包括0.8)都表示爲近似值,其在float
和double
之間具有不同的精度。 a==0.8
中的0.8
是double
,而a
是float
。他們的表述是不同的,他們的價值觀也是不同的。
您絕對不能比較float
-與絕對值相同的值。通常存在輕微的舍入誤差,因爲浮點數是根據IEEE 754來表示的,並且機器無法提供精確的浮點值。
看看here爲您的解釋,特別是舍入規則。
這裏有什麼錯?爲什麼downvote? – 2013-03-26 14:07:30
現在你得到另一個抱怨:p – 2013-03-26 14:26:52
仍然沒有得到它...... – 2013-03-26 14:30:48
給出的答案是正確的......上多布博士安德魯·柯尼希被寫浮筒順序關係,有一個觀點:
我沒有看到這兩個文章中的問題的答案。答案是'a'是'0.8f','0.8f'與雙精度常數'0.8'不同。 – 2013-03-26 17:12:09
要針對雙比較FLOAT。嘗試把一個f
if(a==0.8f)
printf("HELLO")
if(b==0.25f)
printf("WORLD")
一切最終存儲在比特數之後....所以浮點拿到情況下,它們的二進制等價物重複四捨五入...
你是最快的槍SO ,夥計。我點擊「發佈你的答案」,我真的很快。 – 2013-03-26 13:39:52
只需添加一個printf(「%1.12f」,a); 到你的代碼,你會看到舍入錯誤 – Sibster 2013-03-26 13:47:53