[R] Integer / floating point question

Erik Iverson iverson at biostat.wisc.edu
Fri May 16 17:45:43 CEST 2008


Marc -

Marc Schwartz wrote:
> on 05/16/2008 09:56 AM Erik Iverson wrote:
>> Dear R-help -
>>
>> I have thought about this question for a bit, and come up with no 
>> satisfactory answer.
>>
>> Say I have the numeric vector t1, given as
>>
>> t1 <- c(1.0, 1.5, 2.0, 2.5, 3.0)
>>
>> I simply want to reliably extract the unique integers from t1, i.e., 
>> the vector c(1, 2, 3).  This is of course superficially simple to 
>> carry out.
> 
> Use modulo division:
> 
>  > t1[t1 %% 1 == 0]
> [1] 1 2 3
> 
> or
> 
>  > unique(t1[t1 %% 1 == 0])
> [1] 1 2 3

Yes, that is one of the solutions.  However, can I be sure that, say,

2.0 %% 1 == 0

The help page for '%%' addresses this a bit, but then caveats it with 
'up to rounding error', which is really my question.  Is there ever 
'rounding error' with 2.0 %% 1 as opposed to 2 %% 1?

> 
>> However, my question is related to R FAQ 7.31, "Why doesn't R think 
>> these numbers are equal?" The first sentence of that FAQ reads, "The 
>> only numbers that can be represented exactly in R's numeric type are 
>> integers and fractions whose denominator is a power of 2."
>>
>> All the methods I've devised to do the above task seem to ultimately 
>> rely on the fact that identical(x.0, x) == TRUE, for integer x.
>>
>> My assumption, which I'm hoping can be verified, is that, for example, 
>> 2.0 (when, say, entered at the prompt and not computed from an 
>> algorithm) is an integer in the sense of FAQ 7.31.
>>
>> This seems to be the case on my machine.
>>
>>  > identical(2.0, 2)
>> [1] TRUE
>>
>> Apologies that this is such a trivial question, it seems so obvious on 
>> the surface, I just want to be sure I am understanding it correctly.
> 
> Keep in mind that by default and unless specifically coerced to integer, 
> numbers in R are double precision floats:
> 
>  > is.integer(2)
> [1] FALSE
> 
>  > is.numeric(2)
> [1] TRUE
> 
>  > is.integer(2.0)
> [1] FALSE
> 
>  > is.numeric(2.0)
> [1] TRUE
> 
> 
> So:
> 
>  > identical(2.0, as.integer(2))
> [1] FALSE
> 
> 
> Does that help?

A bit, and this is the source of my confusion.  Can I always assume that 
2.0 == 2 when the class of each is 'numeric'?

> 
> Marc Schwartz



More information about the R-help mailing list