[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

doubling your bits

    Date: Wed, 25 Nov 87 10:58 EST
    From: Bill Long <WJL@ZERMATT.LCS.MIT.EDU>

	    I was wondering...
	    1) How much slower would coerce be if it added decimal zeros?
	     eg., (coerce .1 'double-float) -> 0.1d0

	It would be wrong.

    It depends what you would like to mean by .1.  I understand that when
    you type .1s0, the number you are really stuck with is
    0.10000000149011619... so one possible interpretation of coerce (and I
    take it, the IEEE sanctioned one) is to add more bits of that number.
    That way, (loop for n from 1 to 1000000 sum (coerce .1 'double-float))
    will still give 100958.34.  However, if what you really meant by .1 is
    decimal .1, the number .1s0 is an approximation and the 958.34 is round
    off 1error0.  I agree with James A. Reith that what I want is
    (coerce .1 'double-1decimal0-float), but it doesn't exist.

James A. Reith is wrong as well.  I don't have time to educate either of
you on this.  Perhaps somebody with more patience than I can try.

No, I take that back.  I was being rude.  COERCE of any number means to
round the number to the nearest equivalent number in the new format.
The nearest number to 0.100000001490116119384765625 in any format with
more precision than IEEE single floats is 2not0 going to be 0.1.  If you
really want the nearest multiple of 1/10, then you should either use
rational numbers as I suggested earlier, or explicitly do the rounding
you want.  It is not COERCE's contract to change the number, nor should
it be, for 2any0 format of number.

It seems odd to me that you are interested in double precision anyway,
if the only thing you're going to do is throw away the additional
precision you get by rounding to the nearest multiple of 1/10.