From e7e75c2292d99ae0b5c69773819ddd00f04c3c3e Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Sun, 29 Nov 2015 15:07:32 -0600 Subject: [PATCH] Fix exponentiation of negative single-floats and moderately large bignums. --- pkgs/racket-test-core/tests/racket/number.rktl | 3 +++ racket/src/racket/src/number.c | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/pkgs/racket-test-core/tests/racket/number.rktl b/pkgs/racket-test-core/tests/racket/number.rktl index 0d0cb70062..349a3c4100 100644 --- a/pkgs/racket-test-core/tests/racket/number.rktl +++ b/pkgs/racket-test-core/tests/racket/number.rktl @@ -572,6 +572,9 @@ (test -inf.0 expt -4.0 (add1 (expt 2 5000))) (test +inf.f expt -4.0f0 (expt 2 5000)) (test -inf.f expt -4.0f0 (add1 (expt 2 5000))) +;; exponent large enough to overflow singles, but not doubles +(test +inf.f expt -4.0f0 (lcm (exact-round -1.7976931348623151e+308))) +(test -inf.f expt -4.0f0 (add1 (lcm (exact-round -1.7976931348623151e+308)))) (define (inf-non-real? x) (and (not (real? x)) diff --git a/racket/src/racket/src/number.c b/racket/src/racket/src/number.c index 9feb28de65..31d14914f5 100644 --- a/racket/src/racket/src/number.c +++ b/racket/src/racket/src/number.c @@ -3634,7 +3634,16 @@ scheme_expt(int argc, Scheme_Object *argv[]) be converted to infinity, this would return a complex NaN. Instead, we want to return (positive of negative) infinity. See discussion in Github issue 1148. */ +#ifdef MZ_USE_SINGLE_FLOATS + if (sgl) { + /* Need to go through singles to get right overflow behavior. */ + e_dbl = (double)(scheme_bignum_to_float(e)); + } else { + e_dbl = scheme_bignum_to_double(e); + } +#else e_dbl = scheme_bignum_to_double(e); +#endif if ((d < 0.0) && MZ_IS_POS_INFINITY(e_dbl)) { if (SCHEME_TRUEP(scheme_odd_p(1, &e))) { return SELECT_EXPT_PRECISION(scheme_single_minus_inf_object,