2012-06-07 111 views
6

如果执行下面的代码MATLAB会犯一个错误。有人可以验证这一点?Matlab给出了错误的答案

floor([0.1:0.1:2]/0.01) 

那么129在这里做什么?

ans = 10 20 30 40 50 60 70 80 90 100 110 120 129 140 150 160 170 180 190 200 
+8

129.那个鬼鬼祟祟的混蛋。 –

+4

也许我正在分裂头发,但是你能不能完成'10:10:200'? – kevlar1818

+1

相关:[关于浮点精度:为什么迭代次数不相等?](http://stackoverflow.com/a/6478526/97160) – Amro

回答

9

这是一个浮点舍入错误,因为冒号生成的向量。
像RASMAN说,如果你这样做:

floor((0.1:0.1:2 + eps)/0.01) 

不会有舍入误差。

然而,根据how the colon operator works,我建议你做同样的计算是这样的:

floor([(1:20)/10]/0.01) 

[编辑以下RASMAN的评论,我会补充说,后一种方法适用于负值,同时加入eps有时会失败]

底线是使用冒号运算符更好使用我nteger数字,以尽量减少舍入误差。

4

它可能做导致129.99999999999999的不精确值浮点运算...什么,而不是130,然后你地板它129

4

这是一个近似圆带来由阵列建设。解决方案将添加eps:

floor([0.1:0.1:2]/0.01+ eps([0.1:0.1:2]/0.01)) 
+0

谢谢,这是针对这种特定情况的解决方法吗?或者你是否总是在这种情况下推荐这种类型的代码? – mmumboss

+0

大多数时候我看到一个四舍五入的问题,这是因为它被一个最低有效位(可能是2,虽然我不记得看到一个),但通过添加2 * eps可以超级安全,但是((floor([0.1:0.1:200] /0.01 + eps([0.1:0.1:200] /0.01))) - (10:10:20000))' – Rasman

+1

I当你处于积极的领域时,它会起作用 – Rasman

相关问题