[Rd] Error in FrF2 example on Mac OS
Ulrike Grömping
groemping at tfh-berlin.de
Thu Mar 26 00:09:19 CET 2009
---------- Original Message -----------
From: Simon Urbanek <simon.urbanek at r-project.org>
To: Ulrike Grömping <groemp at tfh-berlin.de>
Cc: r-devel at 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
More information about the R-devel
mailing list