Matlab给出了错误的答案

时间:2012-06-07 11:17:58

标签: matlab precision numerical

如果执行以下代码,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

3 个答案:

答案 0 :(得分:9)

由于冒号生成的向量,它是一个浮点舍入误差。
就像拉斯曼所说,如果你这样做:

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

不存在舍入错误。

但是,根据how the colon operator works,我建议您执行相同的计算:

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

[ 编辑 在Rasman的评论之后,我将补充说后一种方法也适用于负值,而添加eps有时会失败

最重要的是,最好使用带有整数数字的冒号运算符来最小化舍入误差。

答案 1 :(得分:4)

它可能正在进行浮点计算,导致不精确的值为129.99999999999999 ......而不是130.然后将其置于129.

答案 2 :(得分:4)

这是阵列结构带来的舍入近似值。解决方案是添加eps:

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