【问题标题】:Loop cannot reach the limit [duplicate]循环无法达到限制[重复]
【发布时间】: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&lt;101; i++) { printf("Iteration %lg\n", i*0.01);。比较通常涉及来自float.h 的 FLT_EPSILON。
  • 另一件事:不要调用浮点数i。只是不要;-)。
  • 用十进制思考:如果将三分之一 (0.333333~) 相加 3 次会发生什么?你没有得到1.0。百分之一可以用十进制精确表示(根据定义),但三分之一不是。

标签: c for-loop compiler-optimization


【解决方案1】:

10.00013

【讨论】:

    【解决方案2】:

    在最后一次迭代中,您会看到 Iteration 9.99013,因为如果循环再次迭代,i 将等于 10.00013,它大于 10,您的循环条件。只要满足条件,for 循环才会继续。

    正如@WeatherVane 指出的那样,您应该查看this question,这解释了为什么您会在i 变量的末尾看到额外的0.00013。

    【讨论】:

    • 我认为 OP 在问为什么 sum 0.01 to 0 多次在迭代结束时给出 X.XXX13。
    • 我认为这不一定值得投反对票,但我编辑了。
    • 我不是反对者。干得好,关于编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2011-03-31
    相关资源
    最近更新 更多