爲什麼是這個代碼的輸出,「再見」 ..而不是「HI」 ......爲什麼是這個代碼的輸出,「再見」 ..而不是「HI」
#include<stdio.h>
int main()
{
float i=1.1;
if(i==1.1)
printf("HI");
else
printf("BYE");
return 0;
}
由於1.1是浮點數,所以不應該是「HI」
爲什麼是這個代碼的輸出,「再見」 ..而不是「HI」 ......爲什麼是這個代碼的輸出,「再見」 ..而不是「HI」
#include<stdio.h>
int main()
{
float i=1.1;
if(i==1.1)
printf("HI");
else
printf("BYE");
return 0;
}
由於1.1是浮點數,所以不應該是「HI」
浮點數不能精確表示。所以你不能直接等同兩個浮點數。它通常與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
因爲你不能比較浮點數是否相等。你需要問「我是否在1.1的可接受容差範圍內?」。人們經常將耐受性命名爲「epsilon」。
您正試圖比較float
和double
嘗試按以下方式進行類型轉換並查看。
int main()
{
float i=1.1;
if(i==(float)1.1) //<------- to float
printf("HI");
else
printf("BYE");
return 0;
}
詳見this
這是因爲精度。 1.1不能用二進制浮點數精確表示。
而是試圖if(i == 1.1f)
或if(i == (float)1.1)
,因爲在你的代碼
if(f == 1.1)
1.1正在考慮爲雙。嘗試1.1F使用爲float處理這個值:
if(f == 1.1f)
希望它有助於
,你沒有得到正確答案的原因是因爲一個事實,即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等)。
因爲,看起來不可思議,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?
1.1是不是一個浮點數,1.1F是
哇!好的,謝謝你指出。不知道。 –