<分区>
我用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 吗?
<分区>
我用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/