[R] The elegant way to test if a number is a whole number

Marc Schwartz marc_schwartz at me.com
Thu Sep 8 21:54:11 CEST 2011


On Sep 8, 2011, at 2:42 PM, David Winsemius wrote:

> 
> On Sep 8, 2011, at 3:35 PM, Alexander Engelhardt wrote:
> 
>> Am 08.09.2011 20:48, schrieb Marc Schwartz:
>> > There was a post from Martin Maechler some years ago and I had to search a bit to find it. For these sorts of issues, I typically trust his judgement.
>> >
>> > The post is here:
>> >
>> >    https://stat.ethz.ch/pipermail/r-help/2003-April/032471.html
>> >
>> > His solution also handles complex numbers.
>> 
>> For those too lazy to follow
>> He is basically creating the function is.whole:
>> 
>>   is.whole <- function(x)
>>     is.numeric(x) && floor(x)==x
> 
> Are you sure? I thought the test would have been all.equal(x, round(x,0) )
> 
> My reasoning was that 1.999999999999 should be considered 2 but floor would make it 1.

David, I am confuzzled. Why would that be equal to 2?

> x == 2
[1] FALSE

> 2 - x
[1] 1.000089e-12

# The default tolerance is .Machine$double.eps ^ 0.5
> all.equal(x, 2, tol = .Machine$double.eps)
[1] "Mean relative difference: 5.000445e-13"

> all.equal(x, 2, tol = .Machine$double.eps ^ 0.5)
[1] TRUE

> 
> > x=1.999999999999
> > x
> [1] 2

> print(x, 15)
[1] 1.999999999999

> > floor(x)
> [1] 1
> > isTRUE(all.equal(x, floor(x)))
> [1] FALSE
> > all.equal(x, round(x,0))
> [1] TRUE
> 
> 
>> 
>> Seems like the most appropriate way now. I'll make it so!

Very apropos on the 45th anniversary of Star Trek. :-)

>> Thanks for your help :-)
>> -- Alex

Cheers,

Marc



More information about the R-help mailing list