a==0 vs as.integer(a)==0 vs all.equal(a,0)
On Tue, 8 Mar 2005, Duncan Murdoch wrote:
On Tue, 8 Mar 2005 09:03:43 +0000, Robin Hankin <r.hankin at soc.soton.ac.uk> wrote :
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.
When you say it isn't legitimate, you mean that it violates the advice never to use exact comparison on floating point values? I think that's just advice, it's not a hard and fast rule. If you happen to know that the values being compared have been calculated and stored exactly, then "==" is valid. In your function, when a and b are integers that are within some range (I'm not sure what it is, but it approaches +/- 2^53), the %% operator should return exact results. (Does it do so on all platforms? I'm not sure, but I'd call it a bug if it didn't unless a and/or b were very close to the upper limit of exactly representable integers.)
It is supposed to do so up to (but not including) .Machine$double.base ^ .Machine$double.digits, normally 2^53, irrespective of sign. (These are computed at run-time, so one can be pretty confident about them, at least if your FPU is bug-free.)
Do you know of examples where a and b are integers stored in floating point, and a %% b returns a value that is different from as.integer(a) %% as.integer(b)?
Yes (see the NEWS for R-devel), but only for large integers where the second is NA.
Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595