【发布时间】:2016-03-09 12:48:30
【问题描述】:
我想了解为什么这个for 不会停止执行到 10。查看代码:
#include <stdio.h>
int main()
{
float i;
for (i = 0.0; i <= 10; i += 0.01)
printf("Iteration %g\n", i);
return 0;
}
最新的迭代是:
迭代 9.96013
迭代 9.97013
迭代 9.98013
迭代 9.99013
为什么会有这种行为?
【问题讨论】:
-
@WeatherVane 也许可以用来标记为重复。
-
您会累积舍入误差,因为您将一个不能准确表示为 IEEE 浮点数 (0.01) 的小数多次添加到另一个浮点数。此外,您进行了精确的比较,浮点数几乎总是错误的。如何计算和比较浮点数的详细规则很难(而且我不知道)。您可以通过乘法获得步骤来避免累积舍入误差:
for(int=0; i<101; i++) { printf("Iteration %lg\n", i*0.01);。比较通常涉及来自float.h的 FLT_EPSILON。 -
另一件事:不要调用浮点数
i。只是不要;-)。 -
用十进制思考:如果将三分之一 (0.333333~) 相加 3 次会发生什么?你没有得到
1.0。百分之一可以用十进制精确表示(根据定义),但三分之一不是。
标签: c for-loop compiler-optimization