]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #5829: complex('1e-500') shouldn't raise an exception.
authorMark Dickinson <dickinsm@gmail.com>
Sat, 25 Apr 2009 13:16:50 +0000 (13:16 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Sat, 25 Apr 2009 13:16:50 +0000 (13:16 +0000)
Also fix some confusing indentation.

Lib/test/test_complex.py
Misc/NEWS
Objects/complexobject.c

index 9a3310198cba04ab46233c017e3aca94ddaf5b4d..000dd9d141097105e1c72802b80caa5a0a4cccb6 100644 (file)
@@ -220,6 +220,9 @@ class ComplexTest(unittest.TestCase):
         self.assertAlmostEqual(complex("+1"), +1)
         self.assertAlmostEqual(complex("(1+2j)"), 1+2j)
         self.assertAlmostEqual(complex("(1.3+2.2j)"), 1.3+2.2j)
+        self.assertAlmostEqual(complex("1E-500"), 1e-500+0j)
+        self.assertAlmostEqual(complex("1e-500J"), 1e-500j)
+        self.assertAlmostEqual(complex("+1e-315-1e-400j"), 1e-315-1e-400j)
 
         class complex2(complex): pass
         self.assertAlmostEqual(complex(complex2(1+1j)), 1+1j)
index b9afc3fc2d66c995b082a0835be4b6be3d3e067f..f3be9370e13160e57eb138384c2d968a57e5e68b 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.6.3
 Core and Builtins
 -----------------
 
+- Issue #5829: complex('1e-500') no longer raises an exception
+
 - Issue #5787: object.__getattribute__(some_type, "__bases__") segfaulted on
   some builtin types.
 
index 9943d0d5004af2abdc59dbd74b4f017064d90d5f..8ce61b747eaf68d9b91f831ba363e38418e0fef1 100644 (file)
@@ -995,16 +995,16 @@ complex_subtype_from_string(PyTypeObject *type, PyObject *v)
                        }
                        errno = 0;
                        PyFPE_START_PROTECT("strtod", return 0)
-                               z = PyOS_ascii_strtod(s, &end) ;
+                       z = PyOS_ascii_strtod(s, &end) ;
                        PyFPE_END_PROTECT(z)
-                               if (errno != 0) {
-                                       PyOS_snprintf(buffer, sizeof(buffer),
-                                         "float() out of range: %.150s", s);
-                                       PyErr_SetString(
-                                               PyExc_ValueError,
-                                               buffer);
-                                       return NULL;
-                               }
+                       if (errno == ERANGE && fabs(z) >= 1.0) {
+                               PyOS_snprintf(buffer, sizeof(buffer),
+                                       "float() out of range: %.150s", s);
+                               PyErr_SetString(
+                                       PyExc_ValueError,
+                                       buffer);
+                               return NULL;
+                       }
                        s=end;
                        if  (*s=='J' || *s=='j') {