mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-120010: Fix invalid (nan+nanj) results in _Py_c_prod() (GH-120287)
In some cases, previously computed as (nan+nanj), we could recover meaningful component values in the result, see e.g. the C11, Annex G.5.1, routine _Cmultd(): >>> z = 1e300+1j >>> z*(nan+infj) # was (nan+nanj) (-inf+infj) That also fix some complex powers for small integer exponents, computed with optimized algorithm (by squaring): >>> z**5 # was (nan+nanj) Traceback (most recent call last): File "<python-input-1>", line 1, in <module> z**5 ~^^~ OverflowError: complex exponentiation
This commit is contained in:
parent
e991ac8f20
commit
8b7c194c7b
3 changed files with 75 additions and 4 deletions
|
@ -299,6 +299,22 @@ class ComplexTest(ComplexesAreIdenticalMixin, unittest.TestCase):
|
|||
self.assertRaises(TypeError, operator.mul, 1j, None)
|
||||
self.assertRaises(TypeError, operator.mul, None, 1j)
|
||||
|
||||
for z, w, r in [(1e300+1j, complex(INF, INF), complex(NAN, INF)),
|
||||
(1e300+1j, complex(NAN, INF), complex(-INF, INF)),
|
||||
(1e300+1j, complex(INF, NAN), complex(INF, INF)),
|
||||
(complex(INF, 1), complex(NAN, INF), complex(NAN, INF)),
|
||||
(complex(INF, 1), complex(INF, NAN), complex(INF, NAN)),
|
||||
(complex(NAN, 1), complex(1, INF), complex(-INF, NAN)),
|
||||
(complex(1, NAN), complex(1, INF), complex(NAN, INF)),
|
||||
(complex(1e200, NAN), complex(1e200, NAN), complex(INF, NAN)),
|
||||
(complex(1e200, NAN), complex(NAN, 1e200), complex(NAN, INF)),
|
||||
(complex(NAN, 1e200), complex(1e200, NAN), complex(NAN, INF)),
|
||||
(complex(NAN, 1e200), complex(NAN, 1e200), complex(-INF, NAN)),
|
||||
(complex(NAN, NAN), complex(NAN, NAN), complex(NAN, NAN))]:
|
||||
with self.subTest(z=z, w=w, r=r):
|
||||
self.assertComplexesAreIdentical(z * w, r)
|
||||
self.assertComplexesAreIdentical(w * z, r)
|
||||
|
||||
def test_mod(self):
|
||||
# % is no longer supported on complex numbers
|
||||
with self.assertRaises(TypeError):
|
||||
|
@ -340,6 +356,7 @@ class ComplexTest(ComplexesAreIdenticalMixin, unittest.TestCase):
|
|||
self.assertAlmostEqual(pow(1j, 200), 1)
|
||||
self.assertRaises(ValueError, pow, 1+1j, 1+1j, 1+1j)
|
||||
self.assertRaises(OverflowError, pow, 1e200+1j, 1e200+1j)
|
||||
self.assertRaises(OverflowError, pow, 1e200+1j, 5)
|
||||
self.assertRaises(TypeError, pow, 1j, None)
|
||||
self.assertRaises(TypeError, pow, None, 1j)
|
||||
self.assertAlmostEqual(pow(1j, 0.5), 0.7071067811865476+0.7071067811865475j)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue