为什么0直接比较时不等于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
答案 0 :(得分: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");
这打印为true,因为在为64位构建时,CGFloat
相当于double
,而不是float
。 float
精度较低;它无法正确表示CGFLOAT_MIN
的值。同样,转换为float
会将其舍入为0.因此,minVar
等于0,即使CGFLOAT_MIN
不是。