Fix problem converting negative bignums to flonums.
authorChris Hanson <org/chris-hanson/cph>
Thu, 18 Feb 2010 06:08:37 +0000 (22:08 -0800)
committerChris Hanson <org/chris-hanson/cph>
Fri, 19 Feb 2010 07:25:56 +0000 (23:25 -0800)
src/microcode/intprm.c
src/microcode/object.h

index 28a9e96c2f3c20c034089ecc3731ad7e4b9d6943..26e5c0aef1a2eb135502826fd5fcd88ee82029cf 100644 (file)
@@ -142,20 +142,10 @@ DEFINE_PRIMITIVE ("INTEGER->FLONUM", Prim_integer_to_flonum, 2, 2, 0)
     SCHEME_OBJECT integer = (ARG_REF (1));
     long control = (arg_index_integer (2, 4));
     if (FIXNUM_P (integer))
-    {
-      long X = (FIXNUM_TO_LONG (integer));
-      double Y = ((double) X);
-
-      if (((long) Y) == X)
-       PRIMITIVE_RETURN (FIXNUM_TO_FLONUM (integer));
-      if ((control & 2) != 0)
-       error_bad_range_arg (1);
-      PRIMITIVE_RETURN (SHARP_F);
-    }
-    if (bignum_fits_in_word_p
-       (integer,
-        (((control & 1) != 0) ? DBL_MANT_DIG : DBL_MAX_EXP),
-        0))
+      PRIMITIVE_RETURN (FIXNUM_TO_FLONUM (integer));
+    if (((control & 1) != 0)
+       ? (LOSSLESS_BIGNUM_TO_DOUBLE_P (integer))
+       : (BIGNUM_TO_DOUBLE_P (integer)))
       PRIMITIVE_RETURN (BIGNUM_TO_FLONUM (integer));
     if ((control & 2) != 0)
       error_bad_range_arg (1);
index 69582e57b2b3569e1ccfa4da2ddf4bd1d12f89ba..916843e7e0bbe01bb1c643c1716df7a74e619af9 100644 (file)
@@ -387,10 +387,10 @@ extern SCHEME_OBJECT * memory_base;
   (bignum_fits_in_word_p ((bignum), ((sizeof (unsigned long)) * CHAR_BIT), 0))
 
 #define BIGNUM_TO_DOUBLE_P(bignum)                                     \
-  (bignum_fits_in_word_p ((bignum), DBL_MAX_EXP, 0))
+  (bignum_fits_in_word_p ((bignum), (DBL_MAX_EXP + 1), 1))
 
 #define LOSSLESS_BIGNUM_TO_DOUBLE_P(bignum)                            \
-  (bignum_fits_in_word_p ((bignum), DBL_MANT_DIG, 0))
+  (bignum_fits_in_word_p ((bignum), (DBL_MANT_DIG + 1), 1))
 
 /* Flonum Operations */