2014-12-05 26 views
1

我有以下代碼
案例1爲什麼有不同類型的輸出的不同的浮筒比較

float a=1.7; 
    if(a==1.7) 
    { 
     printf("Equal\n"); 
    } 
    else if(a<1.7) 
    { 
     printf("less\n"); 
    } 
    else{ 
     printf("Greater\n"); 
    } 

輸出

Greater 

案例2

float a=1.3; 
if(a==1.3) 
{ 
    printf("Equal\n"); 
} 
else if(a<1.3) 
{ 
    printf("less\n"); 
} 
else{ 
    printf("Greater\n"); 
} 

輸出

Less 

爲什麼並不如預期的產出?
爲什麼兩種情況下的輸出都不相同?
誰能解釋這些值是如何存儲和這裏相比
預先感謝

+1

'a'是'float',1.7是'double'。由於分配到最接近的FP值,1.7到'float'和1.7到'double',它們是不同的。 – chux 2014-12-05 04:37:17

+0

當你寫一個= 1.3時,它不完全存儲1.3。它可以是1.3000000001或也可以是1.29999999。這取決於編譯器。所以要檢查兩個浮點數是否相等,你必須使用fabs()。你可以這樣寫: if(fabs(a-1.3)<1e-6) printf(「Equal \ n」); } – Mukit09 2014-12-05 04:37:46

+0

感謝您的回覆 – 2014-12-05 04:43:36

回答

2

的東西組合 -

  • 內部C使用雙; float是一種存儲格式。

  • 1.3是一個無限重複小數二進制

  • IEEE浮點表達時存儲當其四捨五入尾數。 1.3存儲爲浮法得到 捨去,和1.7被向上舍入(通過一點點)

  • 當讀操作將通過添加 設置爲0的至少顯著位額外的數字被轉換爲一個雙該浮子上的。向下取整的值小於它們的 。四捨五入的值儘管全部爲零,但值更大。

  • 並且當比較1.xyzxyz000000與1.xyzxyzxyzxyz(其中並非所有的xyz均爲0, )時,以零結尾的值將會更小。

編輯:無緣IEEE舍入方面較早

對於好奇,這裏是存儲用於1.3和1.7的實際值作爲32位漂浮:
1.299999952316284179687500000000
1.700000047683715820312500000000

和作爲64位浮點數:
1.30000000000000004440892098500626161694526672363281250000000000000000
1.6999999999999999 5559107901499373838305473327636718750000000000000000

2

當您指定float一個文字,然後將結果與相同的文字相比較時,您應該看到這些值是相等的。麻煩的是,在你的代碼中,你沒有比較floatfloat:這是一個floatdouble的比較。

常量1.71.3的類型是double。當您將它們與float進行比較時,float的值在比較之前會擴展爲double。這是值變得不相等的階段:除非常數被精確表示(1.71.3都不能完全表示浮點數),否則會出現轉換錯誤。

您可以通過比較一個float不斷解決這個問題:如果你比較之前投你常數float,平等檢查會成功:

float a=1.7; 
if(a==(float)1.7) { 
    printf("Equal\n"); 
} else if(a<(float)1.7) { 
    printf("less\n"); 
} else { 
    printf("Greater\n"); 
} 

Demo(打印Equals)。

1

在檢查的情況下,它會考慮一個整數。所以它會將浮點值整理爲 整數。

1.7 roundup as 2. 
1.3 roundup as 1. 

所以這就是這個答案的原因。

相關問題