mirror of https://github.com/python/cpython
Issue #15477: Add workaround for log1p(-0.0) on platforms where it's broken.
This commit is contained in:
parent
31a11902b3
commit
05d79e9abf
|
@ -519,15 +519,11 @@ class CMathTests(unittest.TestCase):
|
|||
# of zero, then atan and atanh will also have difficulties with
|
||||
# the sign of complex zeros.
|
||||
@requires_IEEE_754
|
||||
@unittest.skipIf(sysconfig.get_config_var('LOG1P_DROPS_ZERO_SIGN'),
|
||||
"system log1p() function doesn't preserve the sign")
|
||||
def testAtanSign(self):
|
||||
for z in complex_zeros:
|
||||
self.assertComplexIdentical(cmath.atan(z), z)
|
||||
|
||||
@requires_IEEE_754
|
||||
@unittest.skipIf(sysconfig.get_config_var('LOG1P_DROPS_ZERO_SIGN'),
|
||||
"system log1p() function doesn't preserve the sign")
|
||||
def testAtanhSign(self):
|
||||
for z in complex_zeros:
|
||||
self.assertComplexIdentical(cmath.atanh(z), z)
|
||||
|
|
|
@ -104,6 +104,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