2014-01-05 56 views

回答

2

浮點數不能精確表示。所以你不能直接等同兩個浮點數。它通常與epsilon不同。

if(fabs(floatVarialbe-expectedValue) < **FLT_EPSILON**) 
{ 
//statements to execute if they are equal 
} 

你應該fabs函數獲得絕對值[刪除負號],其定義在math.h庫中。 FLT_EPSILON是一個相對誤差及其在float.h時庫

由於舍入誤差所定義,最浮點數最終被 略微不精確的。只要這種不精確性保持很小,通常可以忽略它 。然而,這也意味着預期爲 的數字相等(例如,當通過不同的正確的方法計算相同的結果時)通常略有不同,並且簡單的相等性測試失敗。

,如果你想了解更多

What Every Computer Scientist Should Know About Floating-Point Arithmetic

0

因爲你不能比較浮點數是否相等。你需要問「我是否在1.1的可接受容差範圍內?」。人們經常將耐受性命名爲「epsilon」。

-1

您正試圖比較floatdouble 嘗試按以下方式進行類型轉換並查看。

int main() 
{ 
    float i=1.1; 
    if(i==(float)1.1) //<------- to float 
     printf("HI"); 
    else 
     printf("BYE"); 
    return 0; 
} 

詳見this

0

這是因爲精度。 1.1不能用二進制浮點數精確表示。

而是試圖if(i == 1.1f)if(i == (float)1.1)

+0

哇!好的,謝謝你指出。不知道。 –

0

,因爲在你的代碼

if(f == 1.1) 1.1正在考慮爲雙。嘗試1.1F使用爲float處理這個值:

if(f == 1.1f)

希望它有助於

0

,你沒有得到正確答案的原因是因爲一個事實,即1.1不能完全按照代表1.1在float(由於它的精度有限)。如果您想了解爲什麼的比較簡單的操作+, - ,*,/不要給正確答案很多次,那麼你可以訪問以下鏈接瞭解更多信息 -

What Every Programmer Must Know About Floating Point

現在,你可以修改你的程序,下面來得到正確的結果 -

#include<stdio.h> 
int main() 
{ 
    float i=1.1; 
    if(i==(float)1.1) 
     printf("HI"); 
    else 
     printf("BYE"); 
    return 0; 
} 

這是什麼程序做的是,它的類型轉換的比較值,並賦予它Float數據類型的精度,而不是它使用的Double數據類型編譯器在賦值給a之前表示值ny類型的變量(Int,Float,Double等)。

0

因爲,看起來不可思議,1.1和1.1在轉換爲C編譯器使用的浮點表示形式時並不總是相同的數字。嘗試此程序:

#include<stdio.h> 
int main() 
{ 
    float i=1.1; 
    printf("i=%0.20f 1.1=%0.20f\n", i, 1.1); 
    return 0; 
} 

短的解釋是,浮點表示是對於不是在基部2例如精確表示的值不是精確的,嘗試用1.5代替1.1示例代碼 - 應工作。正如在GreenAsJade的回答中已經提到的那樣,您不會測試浮點數的相等性,您可以測試它們是否「足夠接近以便在本應用程序中被認爲是相等的」。正如DeanSinaean所說的,你並沒有將你的常量限定爲浮點「f」,因此它第一次被轉換爲double。我猜這是第二次不同,因爲編譯器將「1.1」轉換爲浮點數,以便與float類型的「i」進行比較。

對於什麼是引擎蓋下發生的更多細節,頭部到: How are floating point numbers are stored in memory?

相關問題