diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2008-12-11 21:59:08 (GMT) |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2008-12-11 21:59:08 (GMT) |
commit | 717d5d0a501c4061bd195c083a8258bd2a2745ab (patch) | |
tree | 6576331d6b12f0dd8f1bf9b28c876bfafc3de74e /Modules | |
parent | 7c62f89c1f3bfa0baa829080304e020f89ad795a (diff) | |
download | cpython-717d5d0a501c4061bd195c083a8258bd2a2745ab.zip cpython-717d5d0a501c4061bd195c083a8258bd2a2745ab.tar.gz cpython-717d5d0a501c4061bd195c083a8258bd2a2745ab.tar.bz2 |
Merged revisions 67707 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r67707 | mark.dickinson | 2008-12-11 19:28:08 +0000 (Thu, 11 Dec 2008) | 5 lines
Issues #3167, #3682: tests for math.log and math.log10 were failing on
Solaris and OpenBSD. Fix this by handling special values and domain
errors directly in mathmodule.c, passing only positive nonspecial floats
to the system log/log10.
........
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/mathmodule.c | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 79c55d8..5087ecc 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -137,6 +137,58 @@ m_atan2(double y, double x) } /* + Various platforms (Solaris, OpenBSD) do nonstandard things for log(0), + log(-ve), log(NaN). Here are wrappers for log and log10 that deal with + special values directly, passing positive non-special values through to + the system log/log10. + */ + +static double +m_log(double x) +{ + if (Py_IS_FINITE(x)) { + if (x > 0.0) + return log(x); + errno = EDOM; + if (x == 0.0) + return -Py_HUGE_VAL; /* log(0) = -inf */ + else + return Py_NAN; /* log(-ve) = nan */ + } + else if (Py_IS_NAN(x)) + return x; /* log(nan) = nan */ + else if (x > 0.0) + return x; /* log(inf) = inf */ + else { + errno = EDOM; + return Py_NAN; /* log(-inf) = nan */ + } +} + +static double +m_log10(double x) +{ + if (Py_IS_FINITE(x)) { + if (x > 0.0) + return log10(x); + errno = EDOM; + if (x == 0.0) + return -Py_HUGE_VAL; /* log10(0) = -inf */ + else + return Py_NAN; /* log10(-ve) = nan */ + } + else if (Py_IS_NAN(x)) + return x; /* log10(nan) = nan */ + else if (x > 0.0) + return x; /* log10(inf) = inf */ + else { + errno = EDOM; + return Py_NAN; /* log10(-inf) = nan */ + } +} + + +/* math_1 is used to wrap a libm function f that takes a double arguments and returns a double. @@ -758,11 +810,11 @@ math_log(PyObject *self, PyObject *args) if (!PyArg_UnpackTuple(args, "log", 1, 2, &arg, &base)) return NULL; - num = loghelper(arg, log, "log"); + num = loghelper(arg, m_log, "log"); if (num == NULL || base == NULL) return num; - den = loghelper(base, log, "log"); + den = loghelper(base, m_log, "log"); if (den == NULL) { Py_DECREF(num); return NULL; @@ -781,7 +833,7 @@ If the base not specified, returns the natural logarithm (base e) of x."); static PyObject * math_log10(PyObject *self, PyObject *arg) { - return loghelper(arg, log10, "log10"); + return loghelper(arg, m_log10, "log10"); } PyDoc_STRVAR(math_log10_doc, |