From 1e9d7c1d2a2c4d23ea8bc37bea699fe404444cc5 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 5 Nov 2014 09:17:20 -0700 Subject: [PATCH] expt: repair for large power of inexact between 0 and -1 Closes PR 14824 --- .../racket-pkgs/racket-test/tests/racket/number.rktl | 11 +++++++++++ racket/src/racket/src/number.c | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/number.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/number.rktl index 408b19ef33..c4637b562f 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/number.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/number.rktl @@ -555,6 +555,17 @@ (test 0.0 expt -10.0 -10000000000000.0) (test -0.0 expt -10.0 -10000000000001.0) +(test 0.0 expt 0.9999 (expt 2 5000)) +(test 0.0 expt 0.9999 (add1 (expt 2 5000))) +(test 0.0 expt 0.9999 (/ (expt 2 5000) 3)) +(test 0.0 expt -0.9999 (expt 2 5000)) +(test -0.0 expt -0.9999 (add1 (expt 2 5000))) +(test 0.0f0 expt 0.9999f0 (expt 2 5000)) +(test 0.0f0 expt 0.9999f0 (add1 (expt 2 5000))) +(test 0.0f0 expt 0.9999f0 (/ (expt 2 5000) 3)) +(test 0.0f0 expt -0.9999f0 (expt 2 5000)) +(test -0.0f0 expt -0.9999f0 (add1 (expt 2 5000))) + (err/rt-test (max 0 'a)) (err/rt-test (min 0 'a)) (err/rt-test (max 'a 0)) diff --git a/racket/src/racket/src/number.c b/racket/src/racket/src/number.c index de88445ee9..ec98bfa621 100644 --- a/racket/src/racket/src/number.c +++ b/racket/src/racket/src/number.c @@ -3605,6 +3605,18 @@ scheme_expt(int argc, Scheme_Object *argv[]) } } } + } else if ((d < 0.0) && (d > -1.0)) { + /* If `e` is a positive bignum, then the result should be zero, + but we won't get that result if conversion produces infinity */ + if (SCHEME_BIGNUMP(e) && SCHEME_BIGPOS(e)) { +#ifdef MZ_USE_SINGLE_FLOATS + int sgl = !SCHEME_DBLP(n); +#endif + if (SCHEME_FALSEP(scheme_odd_p(1, &e))) + return SELECT_EXPT_PRECISION(scheme_zerof, scheme_zerod); + else + return SELECT_EXPT_PRECISION(scheme_nzerof, scheme_nzerod); + } } }