[R] exactly representable numbers

Prof Brian Ripley ripley at stats.ox.ac.uk
Mon Sep 11 14:20:53 CEST 2006

```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))

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.

> But in answer to your question:  a bisection search is what I'd use:
> you start with x+delta > x, and you know x+0 == x, so use 0 and delta as
> bracketing points.  You should be able to find the value in about 50-60
> bisections if you start with delta == x, many fewer if you make use of
> the double.eps value.  Here's my version:  not tested too much.
>
> f <- function(x) {
>    u <- x
>    l <- 0
>    mid <- u/2
>    while (l < mid && mid < u) {
>      if (x < x + mid) u <- mid
>      else l <- mid
>      mid <- (l + u)/2
>    }
>    u
> }
>
>  > f(1e300)
> [1] 7.438715e+283
>  > 1e300 + 7.438715e+283  > 1e300
> [1] TRUE
>  > 1e300 + 7.438714e+283  > 1e300
> [1] FALSE
>
>
> Duncan Murdoch
>
> >
> >
> >
> > rksh
> >
> >
> >
> >
> >
> > On 11 Sep 2006, at 10:50, Sundar Dorai-Raj wrote:
> >
> >>
> >> Robin Hankin said the following on 9/11/2006 3:52 AM:
> >>> Hi
> >>> Given a real number x,  I want to know how accurately R can
> >>> represent  numbers near x.
> >>> In particular, I want to know the infimum of exactly representable
> >>> numbers greater than x, and the supremum of exactly representable
> >>> numbers
> >>> less than x.  And then the interesting thing is the difference
> >>> between these two.
> >>> I have a little function that does some of this:
> >>> f <- function(x,FAC=1.1){
> >>>    delta <- x
> >>> while(x+delta > x){
> >>>    delta <- delta/FAC
> >>> }
> >>> return(delta*FAC)
> >>> }
> >>> But this can't be optimal.
> >>> Is there a better way?
> >> I believe this is what .Machine\$double.eps is. From ?.Machine
> >>
> >> double.eps: the smallest positive floating-point number 'x' such that
> >>           '1 + x != 1'.  It equals 'base^ulp.digits' if either 'base'
> >>           is 2 or 'rounding' is 0;  otherwise, it is
> >> '(base^ulp.digits)
> >>           / 2'.
> >>
> >>
> >> --sundar
> >
> > --
> > Robin Hankin
> > Uncertainty Analyst
> > National Oceanography Centre, Southampton
> > European Way, Southampton SO14 3ZH, UK
> >   tel  023-8059-7743
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > and provide commented, minimal, self-contained, reproducible code.
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> and provide commented, minimal, self-contained, reproducible code.
>

--
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

```