Commit 2de4be2e authored by Mark Dickinson's avatar Mark Dickinson

Add workaround for log1p(-0.0) on platforms where it's broken.

parent 2cc49745
......@@ -95,6 +95,9 @@ Core and Builtins
Library
-------
- Issue #15477: In cmath and math modules, add workaround for platforms whose
system-supplied log1p function doesn't respect signs of zeros.
- Issue #11062: Fix adding a message from file to Babyl mailbox.
- Issue #15646: Prevent equivalent of a fork bomb when using
......
......@@ -189,6 +189,27 @@ _Py_expm1(double x)
significant loss of precision that arises from direct evaluation when x is
small. */
#ifdef HAVE_LOG1P
double
_Py_log1p(double x)
{
/* Some platforms supply a log1p function but don't respect the sign of
zero: log1p(-0.0) gives 0.0 instead of the correct result of -0.0.
To save fiddling with configure tests and platform checks, we handle the
special case of zero input directly on all platforms.
*/
if (x == 0.0) {
return x;
}
else {
return log1p(x);
}
}
#else
double
_Py_log1p(double x)
{
......@@ -230,3 +251,5 @@ _Py_log1p(double x)
return log(1.+x);
}
}
#endif /* ifdef HAVE_LOG1P */
......@@ -36,10 +36,6 @@ double _Py_log1p(double x);
#define m_expm1 _Py_expm1
#endif
#ifdef HAVE_LOG1P
#define m_log1p log1p
#else
/* if the system doesn't have log1p, use the substitute
function defined in Modules/_math.c. */
/* Use the substitute from _math.c on all platforms:
it includes workarounds for buggy handling of zeros. */
#define m_log1p _Py_log1p
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment