Re: [Rd] BUG in " == " ? (PR#9065)

From: Gavin Simpson <gavin.simpson_at_ucl.ac.uk>
Date: Fri 07 Jul 2006 - 11:15:09 GMT

On Fri, 2006-07-07 at 11:50 +0200, eric.durand@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

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@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Fri Jul 07 21:21:34 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Fri 07 Jul 2006 - 12:27:20 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.