2017-02-08 23 views
0

爲什麼0時,直接比較爲什麼0 == CGFLOAT_MIN是錯誤的?

我的代碼不等於CGLOAT_MIN

float minVar = CGFLOAT_MIN; 

printf("CGFLOAT_MIN = %f\n\n", CGFLOAT_MIN); 
printf("0 == CGFLOAT_MIN \t%s\n", (0) == CGFLOAT_MIN ? "true" : "false"); 
printf("0 == minVar  \t%s\n", (0) == minVar ? "true" : "false"); 
printf("0 == 0.000000  \t%s\n", (0) == 0.000000 ? "true" : "false"); 

輸出爲

CGFLOAT_MIN = 0.000000 

0 == CGFLOAT_MIN false 
0 == minVar   true 
0 == 0.000000  true 
+1

文檔:「對於32位代碼,此值爲1.17549435e-38F',對於64位代碼,則爲2.2250738585072014e-308'。 – jtbandes

+0

你應該很少比較浮點值;使用一個epsilon。 –

回答

4

因爲CGFLOAT_MIN 0等於它的最小可表示積極不 - 零值,CGFloat可以容納。

printf("CGFLOAT_MIN = %f\n\n", CGFLOAT_MIN); 

這將打印0.000000因爲%f符默認爲四捨五入至小數點後6位。 CGFLOAT_MIN在相對較粗的精度水平下取整爲零。

float minVar = CGFLOAT_MIN; 
// ... 
printf("0 == minVar  \t%s\n", (0) == minVar ? "true" : "false"); 

這將打印正確的,因爲,構建64位時,CGFloat相當於double,不floatfloat精度較低;它不能正確表示CGFLOAT_MIN的值。所以,再次,轉換爲float將其舍入爲0.因此,minVar等於0,即使CGFLOAT_MIN不是。