changeset 5912:47ffa085a9ad

Fix a bug when passing a float to truncate and giving a bignum result. src/ChangeLog addition: 2015-05-10 Aidan Kehoe <kehoea@parhasard.net> * floatfns.c (truncate_one_float): Fix a bug here when double_to_integer() (and previously float_to_int()) returned a bignum; this was silently treated as a fixnum, giving consistently incorrect remainders and less consistently-incorrect but still buggy divisors. tests/ChangeLog addition: Check that a bug when supplying #'truncate with one float that rounds to a bignum, has been fixed.
author Aidan Kehoe <kehoea@parhasard.net>
date Sun, 10 May 2015 23:55:41 +0100
parents 48386fd60fd0
children 1b2fdcc3cc5c
files src/ChangeLog src/floatfns.c tests/ChangeLog tests/automated/lisp-tests.el
diffstat 4 files changed, 15 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sun May 10 19:07:09 2015 +0100
+++ b/src/ChangeLog	Sun May 10 23:55:41 2015 +0100
@@ -1,3 +1,11 @@
+2015-05-10  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* floatfns.c (truncate_one_float):
+	Fix a bug here when double_to_integer() (and previously
+	float_to_int()) returned a bignum; this was silently treated as a
+	fixnum, giving consistently incorrect remainders and less
+	consistently-incorrect but still buggy divisors.
+
 2015-05-10  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* floatfns.c (double_to_integer):
--- a/src/floatfns.c	Sun May 10 19:07:09 2015 +0100
+++ b/src/floatfns.c	Sun May 10 23:55:41 2015 +0100
@@ -2263,14 +2263,14 @@
                          number, Qunbound);
   if (return_float)
     {
-      res0 = make_float ((double)XFIXNUM(res0));
+      res0 = make_float (extract_float (res0));
       return values2 (res0, make_float ((XFLOAT_DATA (number)
 					 - XFLOAT_DATA (res0))));
     }
   else
     {
       return values2 (res0, make_float (XFLOAT_DATA (number)
-					- XREALFIXNUM (res0)));
+					- extract_float (res0)));
     }
 }
 
--- a/tests/ChangeLog	Sun May 10 19:07:09 2015 +0100
+++ b/tests/ChangeLog	Sun May 10 23:55:41 2015 +0100
@@ -6,6 +6,8 @@
 	* automated/lisp-tests.el:
 	Check that the rounding functions signal Lisp errors correctly
 	when handed positive and negative infinity and NaN.
+	Check that a bug when supplying #'truncate with one float that
+	rounds to a bignum, has been fixed.
 
 2015-05-08  Aidan Kehoe  <kehoea@parhasard.net>
 
--- a/tests/automated/lisp-tests.el	Sun May 10 19:07:09 2015 +0100
+++ b/tests/automated/lisp-tests.el	Sun May 10 23:55:41 2015 +0100
@@ -1986,6 +1986,9 @@
   (when (featurep 'bignum)
     (assert (not (evenp most-positive-fixnum)) t
       "In the unlikely event that most-positive-fixnum is even, rewrite this.")
+    (Assert (equal (multiple-value-list (truncate (+ most-positive-fixnum 2.0)))
+                   (list (+ most-positive-fixnum 2) 0.0))
+            "checking a bug in single-argument truncate's remainder fixed")
     (Assert-rounding (1+ most-positive-fixnum) (* 2 most-positive-fixnum)
       :one-floor-result `(,(1+ most-positive-fixnum) 0)
       :two-floor-result `(0 ,(1+ most-positive-fixnum))