# HG changeset patch # User james # Date 1081284740 0 # Node ID 4f5e0297b73fc6094713e1fa9958f52c918e9f38 # Parent 55bab11c30e8bdd7f058894fd2deb6e6c1a35c92 [xemacs-hg @ 2004-04-06 20:52:08 by james] Fix bignum_to_double so it actually gives the right answer. diff -r 55bab11c30e8 -r 4f5e0297b73f src/ChangeLog --- a/src/ChangeLog Tue Apr 06 20:50:39 2004 +0000 +++ b/src/ChangeLog Tue Apr 06 20:52:20 2004 +0000 @@ -1,3 +1,7 @@ +2004-04-06 Jerry James + + * number-mp.c (bignum_to_double): Original algorithm was wrong. + 2004-04-06 Stephen J. Turnbull * lisp.h (Other numeric types): Band-aid: #define make_integer. diff -r 55bab11c30e8 -r 4f5e0297b73f src/number-mp.c --- a/src/number-mp.c Tue Apr 06 20:50:39 2004 +0000 +++ b/src/number-mp.c Tue Apr 06 20:52:20 2004 +0000 @@ -159,17 +159,18 @@ bignum_to_double (bignum b) { short rem, sign; - double retval = 0.0; + double retval = 0.0, factor = 1.0; REGISTER unsigned int i; MINT *quo; sign = MP_MCMP (b, bignum_zero) < 0 ? -1 : 1; quo = MP_ITOM (sign); MP_MULT (b, quo, quo); - for (i = 0U; MP_MCMP(quo, bignum_zero) > 0; i++) + for (i = 0U; MP_MCMP (quo, bignum_zero) > 0; i++) { MP_SDIV (quo, 256, quo, &rem); - retval += rem * i * 256; + retval += rem * factor; + factor *= 256.0; } MP_MFREE (quo); return retval * sign;