[R] exactly representable numbers

Prof Brian Ripley ripley at stats.ox.ac.uk
Mon Sep 11 15:01:33 CEST 2006


On Mon, 11 Sep 2006, Duncan Murdoch wrote:

> On 9/11/2006 8:20 AM, Prof Brian Ripley wrote:
> > On Mon, 11 Sep 2006, Duncan Murdoch wrote:
> > 
> > > On 9/11/2006 6:15 AM, Robin Hankin wrote:
> > > > Hi Sundar
> > > > 
> > > > 
> > > > thanks for this.  But I didn't make it clear that I'm interested in
> > > > extreme numbers
> > > > such as 1e300 and 1e-300.
> > 
> > That's not relevant, unless you are interested in extremely small numbers.
> > 
> > > > Then
> > > > 
> > > > > f(1e300)
> > > > [1] 7.911257e+283
> > 
> > (That is inaccurate)
> > 
> > > > is different from
> > > > 
> > > > 1e300*.Machine$double.eps
> > 
> > Yes, since 1e300 is not a power of two.  However, Sundar is right in the
> > sense that this is an upper bound for normalized numbers.
> > 
> > f(1) is .Machine$double.neg.eps, but so it is for all 1 <= x < 2.
> > This gives you the answer:  .Machine$double.neg.eps * 2^floor(log2(x))
> 
> I'm not sure what is going wrong, but that is too small (on my machine, at
> least):
> 
> > f1 <- function(x) .Machine$double.neg.eps * 2^floor(log2(x))
> > f1(1e300)
> [1] 7.435085e+283
> > 1e300 + f1(1e300) == 1e300
> [1] TRUE
> 
> Notice the difference in the 3rd decimal place from the empirical answer from
> my bisection search below.

I wasn't going into that much detail: just what accuracy are we looking 
for here?  .Machine$double.neg.eps isn't that accurate (as its help page 
says).

> > Similarly for going below (but carefully as you get an extra halving on the
> > powers of two).
> > 
> > These results hold for all but denormalized numbers (those below 1e-308).
> > 
> > 
> > > > [I'm interested in the gap between successive different exactly
> > > > representable
> > > > numbers right across the IEEE range]
> > > 
> > > I'm not sure the result you're looking for is well defined, because on at
> > > least the Windows platform, R makes use of 80 bit temporaries as well as
> > > 64 bit double precision reals.  I don't know any, but would guess there
> > > exist examples of apparently equivalent formulations of your question that
> > > give different answers because one uses the temporaries and the other
> > > doesn't.
> > 
> > Not at R level.  For something to get stored in a real vector, it will be a
> > standard 64-bit double.
> 
> I don't think that's a proof, since R level code can call C functions, and
> there are an awful lot of callable functions in R, but I don't have a
> counter-example.

Oh, it is proof: the storage is declared as C double, and extended 
precision double only exists on the chip.  Since R has to look up 'x' 
whenever it sees the symbol, it looks at the stored value, not on a 
register.  A compiler could do better, but the current code cannot.

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-help mailing list