From ec0964861f86f7e1cd74a37a40e7c3997ee9f512 Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Wed, 20 May 2020 15:30:32 -0400 Subject: [PATCH] Check for 0.0 imaginary part in `exp`. Follows Chez Scheme and Guile. Turns `(exp 10000.+0.0i)` into `+inf.0+0.0i` instead of `+inf.0+nan.0i`, which is analagous to the behavior for exact 0 in the complex part. Fixes #3194. --- pkgs/racket-test-core/tests/racket/number.rktl | 8 ++++++++ racket/src/racket/src/number.c | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/pkgs/racket-test-core/tests/racket/number.rktl b/pkgs/racket-test-core/tests/racket/number.rktl index 57a750d3a1..a46c21fb8b 100644 --- a/pkgs/racket-test-core/tests/racket/number.rktl +++ b/pkgs/racket-test-core/tests/racket/number.rktl @@ -2243,6 +2243,14 @@ (test 1.0 exp -0.0) (test 272.0 round (* 100 (exp 1))) +;; should not be NaN +(test +inf.0+0.0i exp 10000000.0+0.0i) +(test +inf.0-0.0i exp 10000000.0-0.0i) +#reader "maybe-single.rkt" +(when has-single-flonum? + (test +inf.f+0.0f0i exp +100000.0f0+0.0f0i) + (test +inf.f-0.0f0i exp +100000.0f0-0.0f0i)) + (test 0 log 1) (test 0.0 log 1.0) (test -inf.0 log 0.0) diff --git a/racket/src/racket/src/number.c b/racket/src/racket/src/number.c index 661ec35476..d5ed8577df 100644 --- a/racket/src/racket/src/number.c +++ b/racket/src/racket/src/number.c @@ -2798,6 +2798,13 @@ static Scheme_Object *complex_exp(Scheme_Object *c) Scheme_Object *cos_a, *sin_a; r = exp_prim(1, &r); + + /* If i is 0.0, avoid computing the cos/sin, since that can end up + producing NaN. */ + if (SCHEME_FLOATP(i) && (SCHEME_FLOAT_VAL(i) == 0.0)) { + return scheme_make_complex(r, i); + } + cos_a = cos_prim(1, &i); sin_a = sin_prim(1, &i);