[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