c - C for循环中的奇怪结果

标签 c for-loop

<分区>

我用C写了下面的代码:

int main(){
  int i;
  double x;
  for (i = 0, x = -1; x<= 1; x = x + 0.025)
    printf("X = %.3f\n",x);
  return 0;
}

不知道为什么,最后一行是“X = 0.975”。

有人能解释一下为什么循环会在此时停止,而不是再向前一步到 X = 1 吗?

最佳答案

欢迎来到美妙的浮点世界,那里没有是它看起来的样子:-)

很可能是 x 的最终值类似于 1.0000000042其中,尽管它会被打印为 1.000 , 仍然比较大于一。

如果您这样修改代码,您就会明白我的意思:

#include <stdio.h>
int main (void) {
    int i;
    double x;
    for (i = 0, x = -1; x <= 1; x = x + 0.025)
        printf("X = %.3f (%.20f)\n", x, x);
    printf("X = %.3f (%.20f)\n", x, x);
    return 0;
}

该输出的行是:

X = -1.000 (-1.00000000000000000000)
X = -0.975 (-0.97499999999999997780)
X = -0.950 (-0.94999999999999995559)
X = -0.925 (-0.92499999999999993339)
X = -0.900 (-0.89999999999999991118)
: : : : :
X = 0.900 (0.90000000000000113243)
X = 0.925 (0.92500000000000115463)
X = 0.950 (0.95000000000000117684)
X = 0.975 (0.97500000000000119904)
X = 1.000 (1.00000000000000111022)

您可以看到错误很快就出现了。

您可能还想打印出值 0.025有了那个%.20f格式说明符 - 你会看到如下内容:

0.02500000000000000139

因为<sup>25</sup>/<sub>1000</sub> (或 <sup>1</sup>/<sub>40</sub> )是无法用 IEEE754 double 精确表示的数字之一。

关于c - C for循环中的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27616186/

相关文章:

c# - 为什么 foreach 循环在某些情况下不起作用?

file - 简单 Bash - for f in *

c - C编译器在功能之前需要标识符

c - 是否可以通过 select() 在无限循环中使用 nanosleep?

c - 使用 makefile 构建 gtk 项目时找不到“gtk/gtk.h”文件

C - 删除已打印的换行符

javascript数组for循环i+1返回未定义

python - 使用列表中的项目创建文件名 - for 循环

C : Arduino : Check to see if all the values in an array are larger than x and set them to zero

c - sscanf 可选列