Mercurial > hg > xemacs-beta
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))