# HG changeset patch # User Aidan Kehoe # Date 1431298541 -3600 # Node ID 47ffa085a9addc8163d39765b612d6b12bddda44 # Parent 48386fd60fd0ad1beb6c9fa9c1bc18d6ee5b715c Fix a bug when passing a float to truncate and giving a bignum result. src/ChangeLog addition: 2015-05-10 Aidan Kehoe * 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. diff -r 48386fd60fd0 -r 47ffa085a9ad src/ChangeLog --- 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 + + * 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 * floatfns.c (double_to_integer): diff -r 48386fd60fd0 -r 47ffa085a9ad src/floatfns.c --- 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))); } } diff -r 48386fd60fd0 -r 47ffa085a9ad tests/ChangeLog --- 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 diff -r 48386fd60fd0 -r 47ffa085a9ad tests/automated/lisp-tests.el --- 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))