这是因浮点数的计算误差导致的。
事实上,你所取的临界点是0.806,而误差却在更早的时候就形成了:如果你把代码中的0.806换成0.744,会发现在ii=30时就会出现这个问题。
可以用下面的代码检验这个问题:
>> a=0.686;h=0.002;
>> for i=1:61,a=a+h;fprintf('%i\t%.4g\n',i, a-(0.686+h*i)),end
1 0
2 0
3 0
4 0
5 0
(中间删去一些行)
25 0
26 0
27 0
28 0
29 0
30 1.11e-016
31 1.11e-016
32 1.11e-016
33 1.11e-016
34 1.11e-016
(中间删去一些行)
56 1.11e-016
57 1.11e-016
58 1.11e-016
59 1.11e-016
60 1.11e-016
61 1.11e-016
解决这个问题我并没有特别好的办法,只是平常涉及到浮点数运算的时候,一般会注意以下原则:
(1)要尽量避免多次对一个小量(如h)进行叠加,最好先对h进行相乘然后再加;
(2)浮点数的关系运算要特别当心(尤其是判断相等)。
你编写程序的风格不够严谨
这种容易出错的地方干脆用个()表达好了