6

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

3 回答 3

9

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

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

不会有舍入误差。

但是,根据冒号运算符的工作原理,我建议您进行相同的计算,如下所示:

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

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

底线是最好使用带有整数的冒号运算符来最小化舍入误差。

于 2012-06-07T11:41:49.190 回答
4

它可能正在执行浮点计算,导致 129.99999999999999 的不精确值......而不是 130。然后你将它降低到 129。

于 2012-06-07T11:27:42.177 回答
4

这是数组构造带来的舍入近似值。解决方案是添加 eps:

floor([0.1:0.1:2]/0.01+ eps([0.1:0.1:2]/0.01))
于 2012-06-07T11:33:18.757 回答