       Re: Ceiling & Floor

• To: mathgroup at yoda.physics.unc.edu
• Subject: Re: Ceiling & Floor
• From: David Withoff <withoff>
• Date: Fri, 3 Apr 1992 18:07:16 -0600

```John Gray writes:

> The comments from Dave Withoff are useful, but still the following three
> computations make one wonder what is really going on.
>
> In:= Ceiling[10^22 + 0.]
>
> Out= 10000000000000000000000
>
> In:= Ceiling[10^23 + 0.]
>
> Out= 99999999999999991611392
>
> In:= Ceiling[10^23 + 0.000000000000000000000000000]
>
> Out= 99999999999999991611392
>
> One expects something to happen between 19 and 20 digits, but not between
> 22 and 23 digits.

All of the digits in Ceiling[<machine double>] beyond machine precision
are ambiguous, and Ceiling returns garbage.  The fact that the garbage
digits cause Ceiling[10^22+0.] to return 10^22 is a coincidence.  The Ceiling
function simply provides a mapping from doubles to integers:

.
.
10.^22 - 1049089      ==> 9999999999999997902848
10.^22 - 1049088      ==> 10000000000000000000000
.
.
.
10.^22 + 1049088      ==> 10000000000000000000000
10.^22 + 1049089      ==> 10000000000000002097152
.
.

There is undoubtedly a pattern that would explain why certain numbers
such as 10^22, 10^22 + 2097152, etc., map as expected, but there is

There is a special number where Ceiling[<machine double>] can no longer
give an unambiguous mathematical ceiling (a "correct" answer).  On a SPARC,
where machine doubles have a precision of 16, that number is 2^53, or

In:= Table[2^53+n-Ceiling[2^53+n+0.], {n, -5, 10}]

Out= {0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0}

The inputs 0. and 0.000000000000000000000000000 are interpreted as machine
doubles, and integer+double gives a double, so Ceiling[10^22 + 0.] is
essentially equivalent to Ceiling[10.^22].

Dave Withoff
withoff at wri.com

```

• Prev by Date: Re: Flattening
• Next by Date: Re: Flattening
• Previous by thread: Re: Flattening
• Next by thread: Optics & Mma