From 07d5a9e3857f9f4f243b3f4891b1ff1b0d087698 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 1 Jan 2013 12:31:24 -0700 Subject: [PATCH] fix `expt' on small negative number and large positive odd The pow() function apparently gets it wrong on some platforms. Closes PR 13391 --- collects/mred/private/wx/gtk/frame.rkt | 1 + collects/tests/racket/number.rktl | 4 ++++ src/racket/src/number.c | 11 ++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/collects/mred/private/wx/gtk/frame.rkt b/collects/mred/private/wx/gtk/frame.rkt index f39ce65295..d5191f5e1d 100644 --- a/collects/mred/private/wx/gtk/frame.rkt +++ b/collects/mred/private/wx/gtk/frame.rkt @@ -406,6 +406,7 @@ (define focus-here? #f) (define/override (on-focus? on?) + (unless on? (on-menu-click)) (on-focus-child on?) (cond [on? diff --git a/collects/tests/racket/number.rktl b/collects/tests/racket/number.rktl index 83c5bdb4dc..c2c1e044de 100644 --- a/collects/tests/racket/number.rktl +++ b/collects/tests/racket/number.rktl @@ -548,6 +548,10 @@ (test (- (expt 5 29)) min (- (expt 5 29)) (expt 5 27)) (test (- (expt 5 29)) min (- (expt 5 27)) (- (expt 5 29))) (test (- (expt 5 29)) min (- (expt 5 29)) (- (expt 5 27))) +(test 0.0 expt -0.1 10000000000000.0) +(test -0.0 expt -0.1 10000000000001.0) +(test 0.0 expt -0.0 10000000000000.0) +(test -0.0 expt -0.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 d58955c60a..2ecec0860f 100644 --- a/src/racket/src/number.c +++ b/src/racket/src/number.c @@ -2729,7 +2729,16 @@ static double sch_pow(double x, double y) return scheme_infinity_val; } } else { - return protected_pow(x, 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, + which some libraries get wrong for some reason */ + if ((x < 0) && (fmod(y, 2.0) == 1.0)) { + r = scheme_floating_point_nzero; + } + } + return r; } } #endif