Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matlab gives wrong answer

If the following code is executed MATLAB makes a mistake. Can someone verify this?

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

So what is the 129 doing here??

ans = 10 20 30 40 50 60 70 80 90 100 110 120 129 140 150 160 170 180 190 200
like image 519
mmumboss Avatar asked Jun 07 '12 11:06

mmumboss


3 Answers

It is a floating point rounding error because of the colon-generated vector.
Like Rasman said, if you do:

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

There will be no rounding errors.

However, based on how the colon operator works, I suggest that you do the same calculation like this:

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

[Edit: following Rasman's comment, I will add that the latter approach works for negative values as well, while adding eps sometimes fails]

The bottom line is that it is better using the colon-operator with integer numbers to minimize rounding errors.

like image 72
Eitan T Avatar answered Sep 28 '22 01:09

Eitan T


It is probably doing a floating point calculation resulting in an inexact value of 129.99999999999999... something instead of 130. and then you floor it to 129.

like image 25
Markus Mikkolainen Avatar answered Sep 28 '22 00:09

Markus Mikkolainen


it's a rounding approximation brought on by the array construction. The solution would be to add eps:

floor([0.1:0.1:2]/0.01+ eps([0.1:0.1:2]/0.01))
like image 43
Rasman Avatar answered Sep 28 '22 01:09

Rasman