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

William Dunlap wdunlap at tibco.com
Fri Sep 9 17:10:27 CEST 2011

```Which of these functions is best really depends on
why you are interested in knowing whether a number
is integral or not.  Why are people interested in this?

I can think of a few

1) I have a C routine with the prototype
void func(int *n)
and to call it with .C() I need to make sure
the data is stored as a C 'int' [4-byte signed
integer].  The appropriate test is is.integer(n).

2) I have computed something that ought to be the
length of an output vector.  E.g.,
> n <- 7
> len <- 1/6 * n * (n+1) * (n+2)
> len
 84
> length(complex(len)) # what?!
 83
Here I wanted the test that len==trunc(len) or len==as.integer(len)
because the constructor complex(len) converts len to an integer using
truncation.

3) I am computing an integral that I know should give
an integral result for certain inputs (e.g, the gamma
function for nonnegative integral inputs) and I want to
do some sanity checks on the output.  Then all.equal(x, round(x))
or abs(x-round(x))<tolerance would be the right check.

Why are people interested in this question?

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Martin Maechler
> Sent: Friday, September 09, 2011 1:41 AM
> To: Marc Schwartz
> Cc: r-help; Alexander Engelhardt
> Subject: Re: [R] The elegant way to test if a number is a whole number
... [ many lines elided ] ...
>     >>>>> 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) )
>
> Yes, I was *very* sure that  the is.whole() above should be
> exactly what it was:
>
> The purpose was really different.
> There, the discussion started from the fact that
>   as.integer(1) gives FALSE in R
> and that some people where making a fuzz about the allegedly
> poor design of S and R in that regard.
>
> The purpose of the above  is.whole()
> was solely to be a
> concise  *alternative* to is.integer(),
> -- which even would work with complex numbers, as Marc
> mentioned...
> and BTW, instead of floor(), trunc(), or ceiling() or even round()
> would have been equally valid.  I had chosen floor() because  in
> mathematics, it is the most frequently used of those four functions.
>