2012-02-27 42 views
1

請解釋爲什麼以下代碼段的行爲有所不同。解釋此浮點行爲

#include<stdio.h> 
int main(){ 
float a=0.1; 
if(a<0.1) 
    printf("less"); 
else 
    printf("greater than equal"); 
getchar(); 
} 

Output:greater than equal

#include<stdio.h> 
int main(){ 
float a=0.7; 
if(a<0.7) 
    printf("less"); 
else 
    printf("greater than equal"); 
getchar(); 
} 

Output:less出乎我的預期。

PS:這不是作業。

+1

下次搜索本網站。這已被詢問了1000多次。 – leppie 2012-02-27 08:06:37

+0

請解釋爲什麼反對投票? – Bazooka 2012-02-27 08:07:10

+0

您未能搜索此網站,這就是爲什麼。 – leppie 2012-02-27 08:07:46

回答

4

您不能在浮點數上可靠地使用比較運算符。

比較兩個浮點數的一個好方法是具有一個精度閾值,該精度閾值相對於被比較的兩個浮點數的大小。

喜歡的東西:

#include <math.h> 
if(fabs(a - b) <= accurary_threshold * fabs(a)) 

良好閱讀:

+0

謝謝,我不知道這件事。 – Bazooka 2012-02-27 08:11:26

+0

@Parminder:現在你就是這麼做的,就是這樣學習,犯錯誤,但從錯誤中學習,不要重複。 :) – 2012-02-27 08:12:42

+0

嘗試學習是我做的。 :) – Bazooka 2012-02-27 08:15:53

2

浮點數不準確。具體而言,您的號碼不一定與浮動數據進行比較。如果您使用'0.7f'而不是'0.7'(至少在我的編譯器上),那麼相同的代碼將與您的預期相符,但您應該通常與閾值進行比較,如前面的答案所述。

10

這裏涉及兩種不同的類型:floatdouble。你是分配float,但然後比較double

試想floatdouble實際上2和4位小數浮點類型代替。現在想象一下你有:

float a = 0.567123 // Actually assigns 0.57 
if (a < 0.567123) // Actually compares 0.5700 with 0.5671 
{ 
    // We won't get in here 
} 

float a = 0.123412; // Actually assigns 0.12 
if (a < 0.123412) // Actually compares 0.1200 with 0.1234 
{ 
    // We will get in here 
} 

顯然這是近似發生了什麼,但它解釋了兩種不同的結果。

這很難說,你應該沒有更多的信息可以做什麼 - 很可能是你不應該使用floatdouble可言,或者你應該用寬容的一些水平比較,或者你應該在任何地方都使用double,否則您應該接受某種程度的「不準確」,這只是系統工作的一部分。

0

當您執行比較時,您正在比較float(24位精度)和double(53位精度)。您的浮點值是通過從更精確的double值四捨五入來創建的。有時它會縮小,有時會變成圓形。它幾乎不會是相同的。

再次嘗試您的例子,但測試所有三個可能的結果:等於,少,和更大。

再次嘗試使用a作爲示例。

再次嘗試您的示例並與浮點數進行比較。

2
#include<stdio.h> 

int main() { 
    float a = 0.7; 
    if (a < 0.7) 
     printf("less"); 
    else 
     printf("greater than equal"); 
    getchar(); 
} 

無後綴浮動常數doublefloat類型。例如,0.7double類型的浮點常量。

if (a < 0.7) 

如在比較表達式右操作數是double類型的,正常的算術轉換應用和a值被提升到doubledoublefloat不具有相同的精度。爲了得到正確的結果,你應該使用float類型的浮點常量。

if (a < 0.7f) 

0.7ffloat類型的浮動恆定。