summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_complex.py
diff options
context:
space:
mode:
authorSergey B Kirpichev <skirpichev@gmail.com>2024-06-29 08:00:48 (GMT)
committerGitHub <noreply@github.com>2024-06-29 08:00:48 (GMT)
commit2cb84b107ad136eafb6e3d69145b7bdaefcca879 (patch)
treedf61067bf19b1f557b49db5c19e0d881774d02ef /Lib/test/test_complex.py
parent0a1e8ff9c15675fdc4d07fa6c59f83808bf00798 (diff)
downloadcpython-2cb84b107ad136eafb6e3d69145b7bdaefcca879.zip
cpython-2cb84b107ad136eafb6e3d69145b7bdaefcca879.tar.gz
cpython-2cb84b107ad136eafb6e3d69145b7bdaefcca879.tar.bz2
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().
Diffstat (limited to 'Lib/test/test_complex.py')
-rw-r--r--Lib/test/test_complex.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py
index fb510ca..155240e 100644
--- a/Lib/test/test_complex.py
+++ b/Lib/test/test_complex.py
@@ -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):