[Rd] log(i, base=i) not giving 1
Ben Bolker
bbolker at gmail.com
Tue Sep 2 23:43:17 CEST 2014
On 14-09-02 08:48 AM, Martin Maechler wrote:
>>>>>> peter dalgaard <pdalgd at gmail.com>
>>>>>> on Tue, 2 Sep 2014 13:43:21 +0200 writes:
>
> > Impressive. Never ceases to amaze me what computers can do these days. ;-)
>
> Indeed,
>
> > It's even more impressive given that we have
>
>
> > static double logbase(double x, double base)
> > {
> > #ifdef HAVE_LOG10
> > if(base == 10) return x > 0 ? log10(x) : x < 0 ? R_NaN : R_NegInf;
> > #endif
> > #ifdef HAVE_LOG2
> > if(base == 2) return x > 0 ? log2(x) : x < 0 ? R_NaN : R_NegInf;
> > #endif
> > return R_log(x) / R_log(base);
> > }
>
> > which, except possibly for base-10 and base-2, would seem to be quite hard to convince to return anything other than 1 if x == base....
>
> Amazingly indeed, it does: From the few platforms I can try
> here, I only see the problem
> on 32 bit Linux, both an (old) ubuntu 12.04.5 and Fedora 19.
>
>> i <- 2:99; i[log(i, base=i) != 1]
> [1] 5 8 14 18 19 25 58 60 64 65 66 67 75 80 84 86 91
>
> so '8' is not so special (as Ben suggested) and also not the
> only power of two for which this happens :
>
>> i <- 2^(1:20); i[log(i, base=i) != 1]
> [1] 8 64 128 4096 8192 16384
>
> Interestingly, it does not happen on 32-bit Windows, nor on any
> 64-bit version of R I've tried.
> Yes, it is amazing that with computer arithmetic, we can't
> even guarantee that U / U = 1 exactly.
>
> Is it basically free to check for x == base in there, so we
> could change to
>
> return (x == base) ? 1. : R_log(x) / R_log(base);
>
> ?
Should I submit a formal bug report about this, or should I assume it
has now been sufficiently noted by R-core?
Opinions about whether it is better to fix in logbase (according to
Martin's suggestion) or in version.R (e.g. BDR's suggestion of using
log2(x)/3 or some other way that makes the function less sensitive) or both?
Ben Bolker
>
>
>
> > On 02 Sep 2014, at 03:27 , Ben Bolker <bbolker at gmail.com> wrote:
>
> >> log(8, base=8L)-1
> >> log(8, base=8)-1
> >> logvals <- setNames(log(2:25,base=2:25)-1,2:25)
> >> logvals[logvals!=0] ## 5,8,14,18,19,25 all == .Machine$double.eps/2
>
> > --
> > Peter Dalgaard, Professor,
> > Center for Statistics, Copenhagen Business School
> > Solbjerg Plads 3, 2000 Frederiksberg, Denmark
> > Phone: (+45)38153501
> > Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
>
> > ______________________________________________
> > R-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
>
More information about the R-devel
mailing list