我写了一个非常简单的matlab代码;
b=4.7;
s=0;
while s <b
s=s+0.1
end
我希望s为4.7,但matlab给出4.8。我对此非常惊讶,因为0.1 47次的计算不应该给出这样的错误。这是一个非常简单的数学。另外,如果我将b更改为4.6代码工作正常。我看了s格式很长,matlab给出了s = 7.9999999999999。有一个非常小的错误,这就是为什么代码给出s = 4.8。这个问题的解决方案是什么?我是否应该对matlab进行简单计算的怀疑。
答案 0 :(得分:1)
我也认为你的问题主要是关于浮点错误。
每当我需要它时,我都会使用以下解决方法:
b=4.7;
s=0;
dev = 1e-15; % Maximum deviation (example)
while b-s > dev
s=s+0.1
end
它只运行47次循环,并在s = 4.7
时结束答案 1 :(得分:1)
已经表明问题是由浮点数引起的。您应该意识到的是,这不是因为matlab做了一些奇怪的事情,而是使用浮点数的其他语言会遇到完全相同的问题,因为有些数字根本无法以这种二进制格式存储。这是一个简单的插图,可以很容易地用许多编程语言复制:
0.3+0.3+0.3==0.9
这应该返回true,但不幸的是它返回false。
如果您想要在相当安全的情况下不遇到此类问题,则应考虑到足够大的容差。但是,您也希望它尽可能小,以防止出现各种问题。
这是一个自动尝试允许合理容忍的解决方案:
b=4.7;
s=0;
tol = 100*eps(b);
while s <b-tol
s=s+0.1
end
请注意,如果我已经知道它需要运行的频率,我会(通常)避免使用while循环。以下代码非常简单,不容易出错:
for s=0:0.1:4.7
s
end