int main() {
float a = 20000000;
float b = 1;
float c = a+b;
if (c==a) { printf("equal"); }
else { printf("not equal");}
return 0;
}
当我运行这个程序时,它会显示“equal”(相等)。 但是,当我将a的值改为2000000(少了一个零)时,答案就不正确了。 为什么?
int main() {
float a = 20000000;
float b = 1;
float c = a+b;
if (c==a) { printf("equal"); }
else { printf("not equal");}
return 0;
}
当我运行这个程序时,它会显示“equal”(相等)。 但是,当我将a的值改为2000000(少了一个零)时,答案就不正确了。 为什么?
float
的精度为24位。数字20000001 = 0x1312d01需要25位才能准确表示,因此必须四舍五入。对于恰好处于两个可表示值之间的值的正常舍入模式是向最后一位零舍入,因此将20000001四舍五入为20000000作为float
。printf("%a", 20000000.f);
可能会有用——尽管当你尝试 printf("%a", 20000001.f);
时可能会感到困惑。 - Pascal Cuoq如果您声明两个变量为浮点类型,即使将这两个值设置为相同,如果您进行相等比较,您将得到不可预测的结果。有关更多详细信息,请搜索IEEE标准(IEEE 754)以表示浮点数。 维基百科文章