---------- Original Message ----------- From: Simon Urbanek <simon.urba...@r-project.org> To: Ulrike Grömping <gro...@tfh-berlin.de> Cc: r-devel@r-project.org Sent: Wed, 25 Mar 2009 10:32:59 -0400 Subject: Re: [Rd] Error in FrF2 example on Mac OS
> On Mar 24, 2009, at 10:41 , Ulrike Grömping wrote: > > > > > > > Petr Savicky wrote: > >> > >> On Tue, Mar 24, 2009 at 02:45:57PM +0100, Uwe Ligges wrote: > >>>> gives the custom error message "nruns must be a power of 2.", > >>>> which is > >>>> generated in the first check within function FrF2: > >>>> > >>>> if (!is.null(nruns)){ > >>>> k <- floor(log2(nruns)) > >>>> if (!2^k==nruns) stop("nruns must be a power of 2.")} > >>> > >>> > >>> Probably a rounding issue on different platforms? > >>> I guess the test should be something like: > >>> > >>> if (!is.null(nruns)){ > >>> if(!isTRUE(all.equal(log2(nruns) %% 1, 0))) > >>> stop("nruns must be a power of 2.") > >>> } > >> > >> Probably, k is needed also later. Assumig that 2^k works correctly, > >> the following could be sufficient > >> > >> if (!is.null(nruns)){ > >> k <- round(log2(nruns)) > >> if (!2^k==nruns) stop("nruns must be a power of 2.")} > >> > >> In order to test the assumption, one can use > >> > >> x <- 2^(0:100 + 0) # use double exponent to be sure > >> all(x == floor(x)) > >> > >> Powers of two are represented exactly, since they have only one > >> significant bit. > >> > >> Petr. > >> > > > > Yes, round instead of floor should also do the job, if rounding is the > > issue. But then, with powers of 2 indeed being represented exactly > > (I would > > expect even on Macs), maybe rounding is not the issue? I have no > > possibility > > to check this, since I do not have access to a Mac with R installed. > > On my > > windows machine, > > all(log2(x)==floor(log2(x))) > > with x as defined above yields TRUE. > > > > What you're missing is that you cannot rely on log2 to give you an > integer. The test above bears no relevance to your problem - this is > not about representing 2^x - this is about log2 which you cannot > expect to satisfy log2(2^b) == b numerically since it could as well be > computed log(x)/log(2) which is not exactly representable. Use round > and all is well :). > > > which(floor(log2(2^x))!=x) > [1] 4 7 8 13 14 15 25 27 29 49 53 57 64 97 > > which(round(log2(2^x))!=x) > integer(0) > > Cheers, > Simon > Yes, round did indeed solve the problem, it just surprises me that the Mac is so different from the other (binary) animals. Regards, Ulrike ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel