From c8ae173e8a4dc6d42d3e1fe8a61b85a2830510af Mon Sep 17 00:00:00 2001 From: Kevin Ryde Date: Thu, 24 Jul 2003 01:03:40 +0000 Subject: [PATCH] (scm_angle): Use scm_flo0 for non-negative inum, bignum and real. --- libguile/numbers.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/libguile/numbers.c b/libguile/numbers.c index 86d78e774..9a9afd45b 100644 --- a/libguile/numbers.c +++ b/libguile/numbers.c @@ -4257,10 +4257,14 @@ SCM_GPROC (s_angle, "angle", 1, 0, 0, scm_angle, g_angle); SCM scm_angle (SCM z) { + /* atan(0,-1) is pi and it'd be possible to have that as a constant like + scm_flo0 to save allocating a new flonum with scm_make_real each time. + But if atan2 follows the floating point rounding mode, then the value + is not a constant. Maybe it'd be close enough though. */ if (SCM_INUMP (z)) { if (SCM_INUM (z) >= 0) - return scm_make_real (atan2 (0.0, 1.0)); + return scm_flo0; else return scm_make_real (atan2 (0.0, -1.0)); } @@ -4271,10 +4275,15 @@ scm_angle (SCM z) if (sgn < 0) return scm_make_real (atan2 (0.0, -1.0)); else - return scm_make_real (atan2 (0.0, 1.0)); + return scm_flo0; } else if (SCM_REALP (z)) - return scm_make_real (atan2 (0.0, SCM_REAL_VALUE (z))); + { + if (SCM_REAL_VALUE (z) >= 0) + return scm_flo0; + else + return scm_make_real (atan2 (0.0, -1.0)); + } else if (SCM_COMPLEXP (z)) return scm_make_real (atan2 (SCM_COMPLEX_IMAG (z), SCM_COMPLEX_REAL (z))); else