From 3c5135fc7a0b7fbbcd8c9baa5d6c9277eea3e80f Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 1 Jan 2013 18:05:37 -0700 Subject: [PATCH] `expt' repair, again Previous repair wasn't general enough; negative powers can also go wrong. --- collects/tests/racket/number.rktl | 2 ++ src/racket/src/number.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/collects/tests/racket/number.rktl b/collects/tests/racket/number.rktl index c2c1e044de..2977faa22b 100644 --- a/collects/tests/racket/number.rktl +++ b/collects/tests/racket/number.rktl @@ -552,6 +552,8 @@ (test -0.0 expt -0.1 10000000000001.0) (test 0.0 expt -0.0 10000000000000.0) (test -0.0 expt -0.0 10000000000001.0) +(test 0.0 expt -10.0 -10000000000000.0) +(test -0.0 expt -10.0 -10000000000001.0) (err/rt-test (max 0 'a)) (err/rt-test (min 0 'a)) diff --git a/src/racket/src/number.c b/src/racket/src/number.c index 2ecec0860f..f2cf488fdc 100644 --- a/src/racket/src/number.c +++ b/src/racket/src/number.c @@ -2732,8 +2732,9 @@ static double sch_pow(double x, double y) double r; r = protected_pow(x, y); if ((r == 0.0) && !minus_zero_p(r)) { - /* check large odd power of a small negative number, + /* check zero result of a odd power of a negative number, which some libraries get wrong for some reason */ + if (y < 0) y = -y; if ((x < 0) && (fmod(y, 2.0) == 1.0)) { r = scheme_floating_point_nzero; }