[Rd] BUG in " == " ? (PR#9065)
Dimitris Rizopoulos
dimitris.rizopoulos at med.kuleuven.be
Fri Jul 7 13:49:13 CEST 2006
----- Original Message -----
From: "Gavin Simpson" <gavin.simpson at ucl.ac.uk>
To: <eric.durand at imag.fr>
Cc: <r-devel at stat.math.ethz.ch>
Sent: Friday, July 07, 2006 1:15 PM
Subject: Re: [Rd] BUG in " == " ? (PR#9065)
> On Fri, 2006-07-07 at 11:50 +0200, eric.durand at imag.fr wrote:
>> Hello,
>> here is the version of R that I use :
>>
>> > version
>> _
>> platform i486-pc-linux-gnu
>> arch i486
>> os linux-gnu
>> system i486, linux-gnu
>> status
>> major 2
>> minor 3.1
>> year 2006
>> month 06
>> day 01
>> svn rev 38247
>> language R
>> version.string Version 2.3.1 (2006-06-01)
>>
>> And here is one of the sequences of isntruction that returns an
>> abberation :
>>
>> > x<-seq(0,1,by=0.01)
>> > x[71]
>> [1] 0.7
>> > which(x == 0.7)
>> numeric(0)
>> > x[71] == 0.7
>> [1] FALSE
>>
>> Or another version of (maybe) the same bug :
>>
>> > x <- 70
>> > x == 70
>> [1] TRUE
>> > x <- x*0
>> > x <- 70
>> > x == 70
>> [1] TRUE
>> > x<-x*0.01
>> > x
>> [1] 0.7
>> > x == 0.7
>> [1] FALSE
>>
>> It seems completely strange ... any help would be greatly
>> appreciated :)
>>
>> Regards,
>> Eric Durand
>
> Not a bug. Floating point precision - see
> http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f
>
> E.g.:
>
> x <- seq(0,1,by=0.01)
> x[71]
> which(x == 0.7) # FALSE
> all.equal(0.7, x[71]) # TRUE
>
> all.equal() should be used for this type of comparison. See
> ?all.equal
>
> You could achieve what you wanted by something like this [ if you
> have a
> real need to use which() ]:
>
> x <- c(0.7, x, 0.7) # more 0.7's
> lims <- range(0.7 + .Machine$double.eps^0.5, 0.7 -
> .Machine$double.eps^0.5)
> which(x >= lims[1] & x <= lims[2])
>
> Not sure if this is a good way to do it or not?
>
> If you need to do this kind of comparison with which(), having a
> v.all.equal() do a vectorised version of all.equal() would be
> useful,
> returning a vector of TRUE/FALSE for each comparison. Maybe this
> already
> exists somewhere?
>
> E.g.:
>
> v.all.equal <- function(x, y) {
> apply(as.matrix(x), 1, function(x, y) {
> retval <- as.logical(all.equal(x, y))
> retval[is.na(retval)] <- FALSE
> retval
> }, y)
> }
>
> which(v.all.equal(x, 0.7)) # 1 72 103
in this case I think it's simpler to do something like:
which(as.logical(sapply(x, all.equal, target = 0.7)))
Best,
Dimitris
----
Dimitris Rizopoulos
Ph.D. Student
Biostatistical Centre
School of Public Health
Catholic University of Leuven
Address: Kapucijnenvoer 35, Leuven, Belgium
Tel: +32/(0)16/336899
Fax: +32/(0)16/337015
Web: http://med.kuleuven.be/biostat/
http://www.student.kuleuven.be/~m0390867/dimitris.htm
> Again, maybe this is a bad thing...? In which case, I guess I'm
> about to
> get told so... ;-)
>
> G
> --
> %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
> Gavin Simpson [t] +44 (0)20 7679 0522
> ECRC & ENSIS, UCL Geography, [f] +44 (0)20 7679 0565
> Pearson Building, [e] gavin.simpsonATNOSPAMucl.ac.uk
> Gower Street, London [w] http://www.ucl.ac.uk/~ucfagls/cv/
> London, UK. WC1E 6BT. [w] http://www.ucl.ac.uk/~ucfagls/
> %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
More information about the R-devel
mailing list