while循环中的Matlab计数器错误

时间:2015-06-12 08:01:26

标签: matlab

我写了一个非常简单的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进行简单计算的怀疑。

2 个答案:

答案 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