【问题标题】:Endless loop in CC中的无限循环
【发布时间】:2012-02-27 06:31:22
【问题描述】:

这里是初学者。 为什么这是一个无限循环?

for (p = 0; p < 5; p += 0.5)
{
    printf("p=%2.2f\n",p);
}

【问题讨论】:

  • 这在我看来不像是一个无限循环
  • p的类型是什么?
  • 将来,如果您发布可重现问题的可编译代码示例,那就太好了。不仅仅是一个不完整的 sn-p,它可能会或可能不会重现问题,具体取决于您填写空白的方式。
  • @user1190555 如果 p 真的是一个浮点数,则循环将终止。 Proof.

标签: c loops for-loop infinite-loop


【解决方案1】:

我认为这取决于p 的声明方式。如果是整数类型,p 将永远为 0(因为0 + 0.5 的结果每次都会被截断为 0)所以for 永远不会停止。

【讨论】:

    【解决方案2】:

    如果pfloatdouble,则代码没有问题,循环将终止。

    如果p 是整数,则代码的行为未定义,因为printf() 中的格式说明符错误。

    【讨论】:

      【解决方案3】:

      您会看到一个无限循环,因为您的 p 是整数类型(例如 int)。无论您将 0.5 添加到 int 多少次,它都将保持为 0,因为 int 会截断分配给它的 double/fp 值。换句话说,它相当于一个循环,每一步都加零。

      如果您将p 设为floatdouble,您的问题就会消失。

      编辑(由 Oli Charlesworth 的评论建议)

      值得注意的是,不鼓励使用浮点数和双精度数来控制循环,因为结果并不总是像您的示例中那样干净。将步长从 0.5(即 2 的 1 的负幂)更改为 0.1(不是 2 的整数负幂)会以一种意想不到的方式改变您看到的结果。

      如果您需要按非整数步进行迭代,您应该考虑使用这个简单的模式:

      // Loop is controlled by an integer counter
      for (int i = 0 ; i != 10 ; i++) {
          // FP value is calculated by multiplying the counter by the intended step:
          double p = i * 0.5;
          // p is between 0 and 4.5, inclusive
      }
      

      【讨论】:

      • +1,确实如此。尽管可能值得一提的是,一般来说,使用浮点类型进行循环控制是一个坏主意。例如,for (double f = 0; f &lt; 1; f+=0.1) 迭代 11 次,而不是 10 次。
      • @OliCharlesworth 谢谢你的好点,我改进了答案以包含它。
      【解决方案4】:

      当您将双精度常数添加到整数变量时,双精度常数“变为”整数。 0.5 变成了 0。所以你把 0 加到 p 上。

      【讨论】:

      • 不,恰恰相反。变量转换为double,因此结果为0.5。但随后将其分配回一个整数,这会导致截断。
      【解决方案5】:

      类型转换问题,float/double 分配给整数类型时会丢失精度。

      附:在条件测试中使用 float/double 确实是一个非常坏主意。并非所有计算机中的浮点数都是准确的。

      【讨论】:

        猜你喜欢
        • 2013-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多