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.
........
This commit is contained in:
Mark Dickinson 2008-12-11 21:59:08 +00:00
parent 7c62f89c1f
commit 717d5d0a50
2 changed files with 58 additions and 3 deletions

View File

@ -155,6 +155,9 @@ C-API
Extension Modules Extension Modules
----------------- -----------------
- Issues #3167, #3682: Fix test_math failures for log, log10 on Solaris,
OpenBSD.
- Issue #4365: Add crtassem.h constants to the msvcrt module. - Issue #4365: Add crtassem.h constants to the msvcrt module.
- Issue #4396: The parser module now correctly validates the with statement. - Issue #4396: The parser module now correctly validates the with statement.

View File

@ -136,6 +136,58 @@ m_atan2(double y, double x)
return atan2(y, x); return atan2(y, 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 math_1 is used to wrap a libm function f that takes a double
arguments and returns 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)) if (!PyArg_UnpackTuple(args, "log", 1, 2, &arg, &base))
return NULL; return NULL;
num = loghelper(arg, log, "log"); num = loghelper(arg, m_log, "log");
if (num == NULL || base == NULL) if (num == NULL || base == NULL)
return num; return num;
den = loghelper(base, log, "log"); den = loghelper(base, m_log, "log");
if (den == NULL) { if (den == NULL) {
Py_DECREF(num); Py_DECREF(num);
return NULL; return NULL;
@ -781,7 +833,7 @@ If the base not specified, returns the natural logarithm (base e) of x.");
static PyObject * static PyObject *
math_log10(PyObject *self, PyObject *arg) math_log10(PyObject *self, PyObject *arg)
{ {
return loghelper(arg, log10, "log10"); return loghelper(arg, m_log10, "log10");
} }
PyDoc_STRVAR(math_log10_doc, PyDoc_STRVAR(math_log10_doc,