Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
1992
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 1992

[Date Index] [Thread Index] [Author Index]

Search the Archive

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[19]:= Ceiling[10^22 + 0.]
> 
> Out[19]= 10000000000000000000000
> 
> In[20]:= Ceiling[10^23 + 0.]
> 
> Out[20]= 99999999999999991611392
> 
> In[21]:= Ceiling[10^23 + 0.000000000000000000000000000]
> 
> Out[21]= 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
otherwise nothing special about 10^22.

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
about 10^16, as expected:

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

Out[288]= {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