我在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的一个步骤之前?
答案 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双精度精确表示的数字。