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 [1] 84 > length(complex(len)) # what?! [1] 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-boun...@r-project.org [mailto:r-help-boun...@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. > > Your topic below ... about accidental rounding or not with > floating point arithmetic is an entirely different issue, > *and* I agree that a solution to your problem should be based on > the same calculations as all.equal.numeric() .. and hence will > be considerably more involved if it should "work" in all border > cases. > > Martin Maechler, ETH Zurich ... [ many more lines elided ] ... ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.