奇怪的结果是C for循环

时间:2014-12-23 07:52:28

标签: 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;
}

我不知道为什么,但最后一行是&#34; X = 0.975&#34;。

有人可以解释一下,为什么循环在这一点停止而不再在X = 1的一个步骤之前?

1 个答案:

答案 0 :(得分:4)

欢迎来到浮点的精彩世界,其中没有似乎: - )

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

因为25/1000(或1/40)是其中一个无法用IEEE754双精度精确表示的数字。