Diverted to R-devel, as I'm requesting comments about a proposal to add is.whole() to R just so this issue does not trail on for centuries (;-), see below.
>>>>> William Dunlap <wdun...@tibco.com> >>>>> on Sat, 18 Oct 2014 10:33:05 -0700 writes: > 3. all.equal(a, as.integer(a)) > Note that this one tests if 'a' can be stored accurately as a 32-bit signed > integer. If you want to know if 'a' can be used as an accurate count, then > you want to test if a+1>a (use abs() in case a is negative). E.g., try this > for a<-2^49-1, about 5*10^14. > You have to decide what properties of integers you are interested in. > Bill Dunlap > TIBCO Software > wdunlap tibco.com good point, thank you, Bill. This whole issue comes up about once year (at least), it seems to me, and every time there are some good and some not so good propositions, some aiming for vectorized / whole object solutions some, only assuming scalar input. Indeed, I'd claim that all three proposals cited below are not good enough in one way or the other.... though one could argue that a "tolerance = 0" version would be good enough, and hence the function(x) x %% 1 == 0 would be sufficient. In the CRAN package 'sfsmisc' (which I maintain), Alain Hauser recently added an is.whole() function which works "vectorized" and uses a 'tolerance' and then all.equal(), but in better way than (most / all ?) what was proposed in this thread (line 486 ff of https://github.com/mmaechler/sfsmisc/blob/master/R/misc-goodies.R ). Further, the CRAN packages 'gmp' ("infinite" precision integer and rational arithmetic) and 'Rmpfr' ('infinite' precision floating point arithmetic) contain an S3 generic is.whole() function and methods for their own number classes and a default method (( which "however" assumes a tolerance of zero, the same as the x %% 1 == 0 proposal)). Given all this, the r-help and stackoverflow threads, maybe we should decide that such an is.whole() function should be added to R and maintained (by me for the time), so we do have a better place to point people to, and well documented -- and eventually "optimized" -- behavior ? Personally I do think I'd want a "signature" of function (x, tolerance = sqrt(.Machine$double.eps)) Martin > On Sat, Oct 18, 2014 at 10:02 AM, PO SU <rhelpmaill...@163.com> wrote: >> >> Tks for your help, after investigate in your link, i find there seems three ways can be adoped: >> 1. is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol) >> e.g. is.wholenumber(1) >> 2. x%%1==0 >> >> >> 3. all.equal(a, as.integer(a)) >> >> >> and also included your last suggestion using floor. and also tks for other helpers! >> -- >> >> PO SU >> mail: desolato...@163.com >> Majored in Statistics from SJTU >> >> At 2014-10-18 22:48:15, "Sergio Fonda" <sergio.fond...@gmail.com> wrote: >> >> Sorry for my previous hurry misunderstanding. >> Try this link: >> http://stackoverflow.com/questions/3476782/how-to-check-if-the-number-is-integer >> >> 2014-10-18 16:25 GMT+02:00 PO SU <rhelpmaill...@163.com>: >> >> It's due to that, 1 is a numeric, 1.2 is a numeric, though it's true. but deeply, when i want to know 1 is an integer, there seems no easy way to get the answer. >> >> So, is there anyone happen to know it? >> >> >> At 2014-10-18 20:10:09, "S Ellison" <s.elli...@lgcgroup.com> wrote: >> >>>> But i use a<-10/b , b is some value ,may be 5, maybe 5.5 >> >>> If you do floating point arithmetic on integers you'll usually get floating point answers, including the 5.0. >> >>> >> >>> See FAQ 7.31 for the usual floating point problem, and ?all.equal for the usual answer to it. You could see if a result is close to an integer by,for example, using all.equal to compare it to itself after rounding. >> >>> >> >>> S ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel