2013-03-26 36 views
0

我計算出下面的代碼並得到了一個奇怪的結果。任何人都可以解釋它如何工作?浮點值條件

main() 
{ 
    float a=0.8; 
    float b=0.25; 
    if(a==0.8) 
     printf("HELLO") 
    if(b==0.25) 
     printf("WORLD") 
} 

而且,我得到的輸出是令人驚訝的

WORLD 

由於事先

回答

5

這是因爲0.25是2的冪(即2^-2),而0.8是不。只能精確地表示兩個冪的精確總和;所有其他數字(包括0.8)都表示爲近似值,其在floatdouble之間具有不同的精度。 a==0.8中的0.8double,而afloat。他們的表述是不同的,他們的價值觀也是不同的。

+0

你是最快的槍SO ,夥計。我點擊「發佈你的答案」,我真的很快。 – 2013-03-26 13:39:52

+0

只需添加一個printf(「%1.12f」,a); 到你的代碼,你會看到舍入錯誤 – Sibster 2013-03-26 13:47:53

3

您絕對不能比較float-與絕對值相同的值。通常存在輕微的舍入誤差,因爲浮點數是根據IEEE 754來表示的,並且機器無法提供精確的浮點值。

看看here爲您的解釋,特別是舍入規則。

+0

這裏有什麼錯?爲什麼downvote? – 2013-03-26 14:07:30

+0

現在你得到另一個抱怨:​​p – 2013-03-26 14:26:52

+0

仍然沒有得到它...... – 2013-03-26 14:30:48

2

要針對雙比較FLOAT。嘗試把一個f

if(a==0.8f) 
    printf("HELLO") 
if(b==0.25f) 
    printf("WORLD") 
0

一切最終存儲在比特數之後....所以浮點拿到情況下,它們的二進制等價物重複四捨五入...