[R] a==0 vs as.integer(a)==0 vs all.equal(a,0)
Robin Hankin
r.hankin at soc.soton.ac.uk
Tue Mar 8 10:03:43 CET 2005
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?
--
Robin Hankin
Uncertainty Analyst
Southampton Oceanography Centre
European Way, Southampton SO14 3ZH, UK
tel 023-8059-7743
More information about the R-help
mailing list