MATLAB 中的一个貌似没有错误的问题,求高手指教!

2025-01-19 06:54:18
推荐回答(2个)
回答1:

这是因浮点数的计算误差导致的。

 

事实上,你所取的临界点是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)浮点数的关系运算要特别当心(尤其是判断相等)。

回答2:

你编写程序的风格不够严谨
这种容易出错的地方干脆用个()表达好了