Asked by Luca Cerone
on 15 Feb 2011

Dear all, I just noticed that if I create a vector like x=[.1:.1:.9] the result apparently is the same as creating it manually as x=[.1 .2 .3 .4 .5 .6 .7 .8 .9]; but it is not like that!

For example

>> x=[.1:.1:.9]

x =

0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000

>> x(3)==.3

ans =

0

how can you explain that? And how can I be sure to create vectors with the required values???

FIY I'm using Matlab 2009b on a Unix environment. Cheers, -Luca

Answer by Davide Ferraro
on 15 Feb 2011

Accepted Answer

The syntax:

x=[.1:.1:.9]

is creating a vector incrementally and due to Floating Point arithmetic approximation the obtained value may be different from the exact value from the vector definition.

Page, Troubleshooting Common Floating-Point Arithmetic Problems perfectly explains this with some possible approaches you may consider, especially if you are planning to do some "exact" comparison with ==.

Sign in to comment.

Answer by Bruno Luong
on 15 Feb 2011

As Davide wrote, colon() operator will build the array by increment of the step (actually half incremental from both ends), and numerical errors will accumulate.

A more accurate way is using linspace(), which is computed by integer multiplication of the step.

a = linspace(0,1,11)

a == [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1]

For what you want, probably the only way to get the exact value as command line is

a = eval('[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1]')

Jos (10584)
on 15 Feb 2011

Hmm, why use the eval ...

a = eval('[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1]')

b = [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1]

isequal(a,b)

Bruno Luong
on 15 Feb 2011

Right Jos, I should write

eval(['[ ' sprintf('0.%d ',0:10) ']'])

Jan
on 15 Feb 2011

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 1 Comment

## Jan (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/1372-how-to-generate-a-vector-with-the-required-values#comment_2447

Sign in to comment.