mirror of
https://github.com/python/cpython.git
synced 2025-10-21 22:22:48 +00:00
gh-119372: Recover inf's and zeros in _Py_c_quot (GH-119457)
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.2, routine _Cdivd().
This commit is contained in:
parent
0a1e8ff9c1
commit
2cb84b107a
3 changed files with 56 additions and 2 deletions
|
@ -94,6 +94,10 @@ class ComplexTest(unittest.TestCase):
|
|||
msg += ': zeros have different signs'
|
||||
self.fail(msg.format(x, y))
|
||||
|
||||
def assertComplexesAreIdentical(self, x, y):
|
||||
self.assertFloatsAreIdentical(x.real, y.real)
|
||||
self.assertFloatsAreIdentical(x.imag, y.imag)
|
||||
|
||||
def assertClose(self, x, y, eps=1e-9):
|
||||
"""Return true iff complexes x and y "are close"."""
|
||||
self.assertCloseAbs(x.real, y.real, eps)
|
||||
|
@ -139,6 +143,33 @@ class ComplexTest(unittest.TestCase):
|
|||
self.assertTrue(isnan(z.real))
|
||||
self.assertTrue(isnan(z.imag))
|
||||
|
||||
self.assertComplexesAreIdentical(complex(INF, 1)/(0.0+1j),
|
||||
complex(NAN, -INF))
|
||||
|
||||
# test recover of infs if numerator has infs and denominator is finite
|
||||
self.assertComplexesAreIdentical(complex(INF, -INF)/(1+0j),
|
||||
complex(INF, -INF))
|
||||
self.assertComplexesAreIdentical(complex(INF, INF)/(0.0+1j),
|
||||
complex(INF, -INF))
|
||||
self.assertComplexesAreIdentical(complex(NAN, INF)/complex(2**1000, 2**-1000),
|
||||
complex(INF, INF))
|
||||
self.assertComplexesAreIdentical(complex(INF, NAN)/complex(2**1000, 2**-1000),
|
||||
complex(INF, -INF))
|
||||
|
||||
# test recover of zeros if denominator is infinite
|
||||
self.assertComplexesAreIdentical((1+1j)/complex(INF, INF), (0.0+0j))
|
||||
self.assertComplexesAreIdentical((1+1j)/complex(INF, -INF), (0.0+0j))
|
||||
self.assertComplexesAreIdentical((1+1j)/complex(-INF, INF),
|
||||
complex(0.0, -0.0))
|
||||
self.assertComplexesAreIdentical((1+1j)/complex(-INF, -INF),
|
||||
complex(-0.0, 0))
|
||||
self.assertComplexesAreIdentical((INF+1j)/complex(INF, INF),
|
||||
complex(NAN, NAN))
|
||||
self.assertComplexesAreIdentical(complex(1, INF)/complex(INF, INF),
|
||||
complex(NAN, NAN))
|
||||
self.assertComplexesAreIdentical(complex(INF, 1)/complex(1, INF),
|
||||
complex(NAN, NAN))
|
||||
|
||||
def test_truediv_zero_division(self):
|
||||
for a, b in ZERO_DIVISION:
|
||||
with self.assertRaises(ZeroDivisionError):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue