Add workaround for log1p(-0.0) on platforms where it's broken.
This commit is contained in:
parent
2cc49745a5
commit
2de4be2efd
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue