2011-11-25 29 views
0

可能重複:
strange output in comparision of float with float literal爲什麼在'if'條件下浮點值條件失敗?

下面是代碼

#include<stdio.h> 
int main() 
{ 
float a=0.3; 
if(a==0.3) 
    printf("Hello World!"); 
else 
    printf("Stack Overflow"); 
return 0; 
} 

我的預期輸出的 「Hello World」。但是我得到了「堆棧溢出」。爲什麼我沒有得到「Hello World」?

if條件有問題嗎?

+0

沒有做過'C'但我想這應該是浮'一== 0.3f'; –

+0

在這種情況下,'a'被提升爲'double',因爲'0.3'是一個雙字面值。由於'0.3'不能完全表示,所以比較失敗。 –

+1

大衛說:「(double)(float)(0.3)'不等於'0.3',因爲前者在整個過程中四捨五入爲精確的,而後者保留了double精度。以10爲底的比喻,假設我拿'1/3'代表3位有效數字:'0.333'。這就是「浮動」a「。現在將「a」的值轉換爲有效數字爲6的值(「double」):「0.333000」。這不等於'0.333333'(三分之一的值爲「雙倍」)。 –

回答

0

浮點值不得使用==!=運算符進行比較。 大多數浮點值沒有精確的二進制表示,並且精度有限。 See what you can do

5

Comparing floating point numbers

浮點運算並不精確。像0.2這樣的簡單值不能用二進制浮點數精確表示,並且浮點數的有限精度意味着操作順序的輕微變化可能會改變結果。不同的編譯器和CPU體系結構以不同的精度存儲臨時結果,因此結果會因環境的細節而有所不同。如果你做了一個計算,然後將結果與一些預期值進行比較,那麼你很可能得不到你想要的結果。

試試這個方法:

#include<stdio.h> 
int main() 
{ 
float a=0.3; 
float acceptedDiff = 0.0000001; 
if(fabsf(a-0.3) < acceptedDiff) 
    printf("Hello World!"); 
else 
    printf("Stack Overflow"); 
return 0; 
} 
+0

感謝MichałPowaga :) – Dinesh

+0

正確和最安全的方法是始終查看2個數字之間的相對差異,而不是差異。 –

0

這是因爲像0.3的值不能準確地用二進制浮點數字表示。臨時值的存儲方式不同,因此無法與此相比較。 a和0.3的值因此存儲方式不同,您不能依賴這種直接比較。

0

是因爲據我所知,而IF語句比較變量和值它進入價值的機器級信息和存儲。

第一行你聲明a = 0.3爲浮點類型,所以它將以二進制格式存儲在內存中,並帶有額外的填充位。當你將它與Exact「0.3」進行比較時,它總是會失敗。

2

試一下:)

if (a == 0.3f) 

if (a == (float)0.3)