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