[Rd] invalid comparison in numeric sequence (PR#13551)
Petr Savicky
savicky at cs.cas.cz
Wed Feb 25 18:08:25 CET 2009
> > seq(0,1,0.1)==0.4
> [1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
> > seq(0,1,0.1)==0.6
> [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> > seq(0,1,0.1)==0.8
> [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
>
> What is wrong with 0.6 ??? (TRUE is missing)
> I tried 3 differents computers (2 Ubuntu with R 2.8.1, and one Mac with R 2.8).
If you know that all the numbers in a sequence should have a given decimal
precision, then you obtain a better result using round(,digits=...).
For example,
x <- round(seq(0,1,0.1), digits=1)
rbind(x == 0.4, x == 0.6, x ==0.8)
produces
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
This does not mean, that x[7] is now equal to 0.6, however both x[7] and 0.6
are represented by the same 53-bit floating point number
formatC(x[7], digits=20) # "0.5999999999999999778"
formatC(0.6, digits=20) # "0.5999999999999999778"
Petr.
More information about the R-devel
mailing list