下面是我的matlab代码片段:

clear all;
x0=0.5;
x2=1.4;
h=0.1;
while(x0<x2)
    x0=x0+0.1;
end
x0

毫无疑问,x0 的结果是 1.4 ,让我感到困惑的是,当我将 x2=1.4 替换为 x2=0.8, 0.9, 1.0, 1.1, or 1.2 (其中任何一个)时,结果变得不正确。

例如, x2=0.9 将使代码生成 x0=1.0 而不是 x0=0.9 。而且我发现在 x0 增加到 0.9 的过程中,x0<x2 ( 0.9<0.9 ) 会产生 1 (True) 这绝对是错误的。

这里发生了什么?

最佳答案

我想稍微扩展一下丹的回答。运行此代码:

clear all;
x0=0.5;
x2=0.9;
h=0.1;
while(x0<x2)
    x0=x0+0.1;
    disp(x2-x0); % <-- I added this line
end
x0

输出( ideone ):
0.30000
0.20000
0.10000
1.1102e-16
-0.100000
x0 =  1.00000

输出的第 4 行显示了舍入误差:将 0.10.5 相加四次后,结果将小于 0.9 :差异是 1.1102e-16 。这就是为什么 x0 最终会是 1.0 的原因。

关于matlab 将 0.9<0.9 评估为 `True`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22991628/

10-12 16:05