2017-02-08 18 views
0

0を比較する場合CGFLOAT_MINそれは最小の表現以外の正のです0に等しいないあるので直接なぜ0 == CGFLOAT_MINはfalseですか?

マイコード

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

浮動小数点値を正確に比較することはめったにありません。イプシロンを使用する。 –

答えて

4

ある等しいCGLOAT_MINされていない理由-が保持できるゼロの値。

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

これは、小数点以下6桁に丸めるに%f指定子のデフォルトので0.000000を印刷します。 CGFLOAT_MINは、その比較的粗い精度でゼロに切り下げられます。

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

64ビットのために構築する際に、CGFloatdouble、ないfloatに相当し、これは本当印刷します。 floatの精度は低くなります。 CGFLOAT_MINの値を正しく表すことができません。したがって、floatに変換すると、0に丸められます。minVarは、CGFLOAT_MINではありませんが、0に等しくなります。

関連する問題