【问题标题】:Problem with understanding floats in c.. Why does it go into infinite loop?理解 c 中浮动的问题。为什么它会进入无限循环?
【发布时间】:2019-09-09 12:54:43
【问题描述】:

我正在尝试更新我的 C 知识,但我遇到了浮动错误。

例如这个循环将是无限的:

#include <stdio.h>

int main(){

    for (float i =18000000; i<18000002; i++){
        printf("%f\n", i);
    }
    printf("win\n");
    return 0;
}

为什么会这样?..

【问题讨论】:

  • 可能是因为18000001会向下舍入到18000000,所以永远不会达到18000002,因为它在增加后总是向下舍入。发生这种情况的原因是因为IEEE 754 floats have a precision of 6-9 digits 所以 1 可能已经超出了该范围。
  • `18000000.000000.000000.00000000000000000000000000000000000000000000000000000000000000000000000000000000.000000.000000.000000000000000000000000000000000000000000000000000000000000000000.000000000000000000000000000000来
  • @Blaze 听起来像是对这个问题的回答,除非我们应该简单地把它当作“为什么浮点不准确”的骗子。
  • @Lundin,是的,我认为这个骗子很合适。
  • 这就是为什么你应该忘记float 是一个类型。浮点声明拼写为double

标签: c loops floating-point


【解决方案1】:

float 的精度有限。假设它是在 IEEE754 单精度浮点中实现的,它只有 24 位精度,即大约 7 个十进制数字。

数字 18000000 可以用这种格式精确表示,但 18000001 不能,因此加 1 会导致低端的额外位被舍入或截断,从而得到值 18000000。所以你得到一个无限循环。

【讨论】:

    【解决方案2】:

    最接近 18000001 的 IEEE754 float18000000。所以i++ 本质上是一个空操作。请注意,18000002 也同样接近 18000001,但如果出现平局,则选择更接近零的 float

    (由于18000000是整数类型,i &lt; 18000002发生在float算术中。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-19
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多