# x = 0:0.1:10... What's going on, really?

519 views (last 30 days)

Show older comments

Please have a look at the following example:

A = 0:0.1:0.4;

find(A == 0.3)

ans =

Empty matrix: 1-by-0

find(A == 0.1+0.1+0.1)

ans =

4

This is in my opinion expected behavior, as 0.1 can't be represented accurately with floating point numbers. What's bugging me is the following:

A = 5.8:0.1:6

A =

5.8000 5.9000 6.0000

find(A == 5.9)

ans =

2

%%Found it!

A = 5.8:0.1:6.1

A =

5.8000 5.9000 6.0000 6.1000

find(A == 5.9)

ans =

Empty matrix: 1-by-0

%%Didn't find it!

find(A == 5.8+0.1)

ans =

2

%%Found it again!

For the record, linspace results in the same results.

A = linspace(5.8, 6.0, 3)

A =

5.8000 5.9000 6.0000

find(A == 5.9)

ans =

2

A = linspace(5.8, 6.1, 4)

A =

5.8000 5.9000 6.0000 6.1000

find(A == 5.9)

ans =

Empty matrix: 1-by-0

find(A == 5.8+0.1)

ans =

2

Notice that the only difference is that the vectors are going to 6.1 instead of 6.0. So, what's going on? Are the following two actually the same: x = [a:b:c] and y = linspace(a,c,(c-a)/b+1)?

A = 5.8:0.1:6.1

A =

5.8000 5.9000 6.0000 6.1000

B = linspace(5.8,6.1,4)

B =

5.8000 5.9000 6.0000 6.1000

A == B

ans =

1 1 1 1

It might appear that way... But the answer is of course no, they're not the same!

x = -0.1:0.1:0.3

x =

-0.1000 0 0.1000 0.2000 0.3000

y = linspace(-0.1,0.3,5)

y =

-0.1000 0 0.1000 0.2000 0.3000

x == y

ans =

1 1 0 0 1

So, what happens when you do A = 5.8:0.1:6? How are the numbers created? And how can the following be explained?

A = 5.8:0.1:6;

B = 5.8:0.1:6.1;

A(2)-B(2)

ans =

8.8818e-016

eps(5.9)

ans =

8.8818e-016

##### 0 Comments

### Accepted Answer

José-Luis
on 1 May 2014

Edited: José-Luis
on 1 May 2014

Well, just look at how linspace is implemented:

edit linspace

It might explain some of the behavior you see. On an additional note, comparing double value is risky business. Not only the way you perform a computation (as you so thoroughly illustrate) but the order in which you perform the operations will matter.

Even different compilers might give different results, since they might order operations differently. This means that you can potentially get different results in Matlab if you use different platforms.

EDIT:

As for the colon, here is how it is implemented according to the documentation:

j:i:k is the same as [ j,j+i,j+2i, ...,j+m*i ], where m = fix((k-j)/i), for integer values. For information on the definition of j:i:k with floating-point values, see Technical Solution 1-4FLI96. This syntax returns an empty matrix when i == 0, i > 0 and j > k, or i < 0 and j < k.

##### 2 Comments

Jeffrey
on 25 Jul 2014

### More Answers (2)

Image Analyst
on 1 May 2014

##### 1 Comment

Ayesha iqbal
on 9 Jul 2023

If v= 1:3:12 is a vector then v(3)=....?

##### 1 Comment

Image Analyst
on 9 Jul 2023

This does not look like an answer to @John Doe so it seems like you asking this simple question for yourself. You should know that you can do

v = 1:3:12

element3 = v(3)

but since you don't, you can learn such fundamental concepts by investing 2 hours of your time here:

### See Also

### Categories

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!