diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2014-10-10 21:49:32 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2014-10-10 21:49:32 (GMT) |
commit | d0a5e9bb4a153f4d6d6b890c7de20d781bc95819 (patch) | |
tree | 76ad9c96f405cd39afea4060d56b1509a35f087f | |
parent | f126fa59f608f5010ca78dbffd6814820b0aaca1 (diff) | |
download | cpython-d0a5e9bb4a153f4d6d6b890c7de20d781bc95819.zip cpython-d0a5e9bb4a153f4d6d6b890c7de20d781bc95819.tar.gz cpython-d0a5e9bb4a153f4d6d6b890c7de20d781bc95819.tar.bz2 |
Issue #22604: Fix assertion error in debug mode when dividing a complex number by (nan+0j).
-rw-r--r-- | Lib/test/test_complex.py | 9 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Objects/complexobject.c | 8 |
3 files changed, 16 insertions, 4 deletions
diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py index 59e8677..c0383b2 100644 --- a/Lib/test/test_complex.py +++ b/Lib/test/test_complex.py @@ -26,7 +26,7 @@ class ComplexTest(unittest.TestCase): unittest.TestCase.assertAlmostEqual(self, a, b) def assertCloseAbs(self, x, y, eps=1e-9): - """Return true iff floats x and y "are close\"""" + """Return true iff floats x and y "are close".""" # put the one with larger magnitude second if abs(x) > abs(y): x, y = y, x @@ -61,7 +61,7 @@ class ComplexTest(unittest.TestCase): self.fail(msg.format(x, y)) def assertClose(self, x, y, eps=1e-9): - """Return true iff complexes x and y "are close\"""" + """Return true iff complexes x and y "are close".""" self.assertCloseAbs(x.real, y.real, eps) self.assertCloseAbs(x.imag, y.imag, eps) @@ -108,6 +108,11 @@ class ComplexTest(unittest.TestCase): self.assertAlmostEqual(complex.__truediv__(2+0j, 1+1j), 1-1j) self.assertRaises(ZeroDivisionError, complex.__truediv__, 1+1j, 0+0j) + for denom_real, denom_imag in [(0, NAN), (NAN, 0), (NAN, NAN)]: + z = complex(0, 0) / complex(denom_real, denom_imag) + self.assertTrue(isnan(z.real)) + self.assertTrue(isnan(z.imag)) + def test_floordiv(self): self.assertAlmostEqual(complex.__floordiv__(3+0j, 1.5+0j), 2) self.assertRaises(ZeroDivisionError, complex.__floordiv__, 3+0j, 0+0j) @@ -10,6 +10,9 @@ What's New in Python 2.7.9? Core and Builtins ----------------- +- Issue #22604: Fix assertion error in debug mode when dividing a complex + number by (nan+0j). + - Issue #22470: Fixed integer overflow issues in "backslashreplace" and "xmlcharrefreplace" error handlers. diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 5ee0c15..2659a23 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -96,7 +96,7 @@ c_quot(Py_complex a, Py_complex b) const double abs_breal = b.real < 0 ? -b.real : b.real; const double abs_bimag = b.imag < 0 ? -b.imag : b.imag; - if (abs_breal >= abs_bimag) { + if (abs_breal >= abs_bimag) { /* divide tops and bottom by b.real */ if (abs_breal == 0.0) { errno = EDOM; @@ -109,7 +109,7 @@ c_quot(Py_complex a, Py_complex b) r.imag = (a.imag - a.real * ratio) / denom; } } - else { + else if (abs_bimag >= abs_breal) { /* divide tops and bottom by b.imag */ const double ratio = b.real / b.imag; const double denom = b.real * ratio + b.imag; @@ -117,6 +117,10 @@ c_quot(Py_complex a, Py_complex b) r.real = (a.real * ratio + a.imag) / denom; r.imag = (a.imag * ratio - a.real) / denom; } + else { + /* At least one of b.real or b.imag is a NaN */ + r.real = r.imag = Py_NAN; + } return r; } |