[R] a==0 vs as.integer(a)==0 vs all.equal(a,0)

Peter Dalgaard p.dalgaard at biostat.ku.dk
Tue Mar 8 10:45:26 CET 2005


Robin Hankin <r.hankin at soc.soton.ac.uk> writes:

> hi
> 
> 
> ?integer says:
> 
>       Note that on almost all implementations of R the range of
>       representable integers is restricted to about +/-2*10^9: 'double's
>       can hold much larger integers exactly.
> 
> 
> I am getting very confused as to when to use integers and when not to.
> In my line
> I need exact comparisons of large integer-valued arrays, so I often
> use as.integer(),
> but the above seems to tell me that doubles might  be better.
> 
> Consider the following R idiom of Euclid's algorithm for the highest
> common factor
> of two positive integers:
> 
>    gcd <- function(a, b){
>      if (b == 0){ return(a)}
>      return(Recall(b, a%%b))
>    }
> 
> If I call this with gcd(10,12), for example, then  a%%b is not an
> integer, so the first
> line of the function, testing b for being zero, isn't legitimate.
> 
> OK, so I have some options:
> 
> (1) stick in "a <- as.integer(a),  b <- as.integer(b)" into the
> function:  then a%%b *will* be an
>                 integer and the "==" test is appropriate
> (2) use some test like abs(b) < TOL for some suitable TOL (0.5?)
> (3) use identical(all.equal(b,0),TRUE) like it says in identical.Rd
> (4) use identical(all.equal(b,as.integer(0)),TRUE)
> 
> How does the List deal with this kind of problem?
> 
> Also, gcd() as written returns a non-integer.  Would the List
> recommend rewriting the last
> line as
> 
> return(as.integer(Recall(b,a%%b)))
> 
> or not?

Not if you want things to work in the large-integer domain...

You're in somewhat murky waters here because it all has to do with
whether you can rely on the floating point aritmetic being exact for
integers up to 2^53. *If* that works, then there's really no reason to
distrust "==" in this context and the gcd() works as originally
written. You might consider wrapping it in a function that checks
whether a and b are both (1) in range and (2) that they are integers
in the sense that round(x)==x. (Failing 2, you likely get an infinite
recursion). 

-- 
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907




More information about the R-help mailing list