[R] Strange behaviour of as.integer()

Magnus Torfason zulutime.net at gmail.com
Thu Jan 7 16:01:28 CET 2010


There have been some really great responses to this question. I would 
like to make a minor contribution by throwing the 'gmp' package into the 
mix.

On 1/7/2010 8:12 AM, Duncan Murdoch wrote:
> On 07/01/2010 7:31 AM, Ulrich Keller wrote:
>>> as.integer(.57 * 100)
>> [1] 56
>
> Yes, as the man page states, non-integer values are truncated towards
> zero.
>
>  > .57*100 < 57
> [1] TRUE

gmp provides the bigz and bigq classes which provide arbitrary precision 
integers and rationals, and would solve Ulrich's original
problem quite effectively:

 > library(gmp)
 >
 > # bigq will not parse "0.57" but writing such a parser
 > # would be a trivial extension.
 > x = as.bigq("57")/100
 > x
[1] "57/100"
 >
 > # as.integer(x*100) does not seem to be overloaded correctly, so
 > # we need to use as.numeric first, but the end result is 57
 > as.integer(as.numeric(x*100))
[1] 57
 >
 > # And we conclude by making some comparisons, and finding the that
 > # the results are what a fifth-grader would expect, rather than
 > # what a CS grad would expect :-)
 > x*100<57
[1] FALSE
 > x*100==57
[1] TRUE

Of course there is still the problem that:
 > 1+1 == sqrt(2)*sqrt(2)
[1] FALSE
and gmp will not solve this . I don't know if there is an R-package for 
arbitrary-precision reals floating around, but probably not.
However, Wolfram Alpha will return the correct answer:
http://tr.im/1plus1equals2


Best,
Magnus



More information about the R-help mailing list