From c82f332e1eb85da065e2c96c4fd89cd6e489445d Mon Sep 17 00:00:00 2001 From: Kevin Ryde Date: Sat, 23 Sep 2006 01:16:50 +0000 Subject: [PATCH] More of: * numbers.c, numbers.h (scm_log, scm_log10, scm_exp, scm_sqrt): New functions. --- libguile/numbers.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/libguile/numbers.c b/libguile/numbers.c index d3cc41ef4..b9adb1e69 100644 --- a/libguile/numbers.c +++ b/libguile/numbers.c @@ -70,10 +70,13 @@ #include "libguile/discouraged.h" -/* value per glibc, if not already defined */ +/* values per glibc, if not already defined */ #ifndef M_LOG10E #define M_LOG10E 0.43429448190325182765 #endif +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif @@ -6028,7 +6031,12 @@ SCM_DEFINE (scm_log, "log", 1, 0, 0, { /* ENHANCE-ME: When z is a bignum the logarithm will fit a double although the value itself overflows. */ - return scm_from_double (log (scm_to_double (z))); + double re = scm_to_double (z); + double l = log (fabs (re)); + if (re >= 0.0) + return scm_from_double (l); + else + return scm_c_make_rectangular (l, M_PI); } } #undef FUNC_NAME @@ -6054,7 +6062,12 @@ SCM_DEFINE (scm_log10, "log10", 1, 0, 0, { /* ENHANCE-ME: When z is a bignum the logarithm will fit a double although the value itself overflows. */ - return scm_from_double (log10 (scm_to_double (z))); + double re = scm_to_double (z); + double l = log10 (fabs (re)); + if (re >= 0.0) + return scm_from_double (l); + else + return scm_c_make_rectangular (l, M_LOG10E * M_PI); } } #undef FUNC_NAME