]> granicus.if.org Git - python/commitdiff
Issue #3382: Make '%F' and float.__format__('F') convert results to upper case. Much...
authorEric Smith <eric@trueblade.com>
Sun, 29 Nov 2009 17:40:57 +0000 (17:40 +0000)
committerEric Smith <eric@trueblade.com>
Sun, 29 Nov 2009 17:40:57 +0000 (17:40 +0000)
Lib/test/formatfloat_testcases.txt
Lib/test/test_complex.py
Lib/test/test_float.py
Misc/NEWS
Objects/stringlib/formatter.h
Objects/stringobject.c
Objects/unicodeobject.c

index 4cf20aa8c9b0f97c55383db403fe9941c5bd830a..43ef0409543b6d403a3427e489e7debb50697b69 100644 (file)
 %f 0.0000005001 -> 0.000001
 %f 0.0000004999 -> 0.000000
 
+-- nans and infinities
+%f nan -> nan
+%f inf -> inf
+%f -infinity -> -inf
+%F nan -> NAN
+%F infinity -> INF
+%F -inf -> -INF
+
 -- 'e' code formatting with explicit precision (>= 0). Output should
 -- always have exactly the number of places after the point that were
 -- requested.
 %#.1e 123.4 -> 1.2e+02
 %#.2e 0.0001357 -> 1.36e-04
 
+-- nans and infinities
+%e nan -> nan
+%e inf -> inf
+%e -infinity -> -inf
+%E nan -> NAN
+%E infinity -> INF
+%E -inf -> -INF
+
 -- 'g' code formatting.
 
 -- zeros
 %#.5g 234.56 -> 234.56
 %#.6g 234.56 -> 234.560
 
+-- nans and infinities
+%g nan -> nan
+%g inf -> inf
+%g -infinity -> -inf
+%G nan -> NAN
+%G infinity -> INF
+%G -inf -> -INF
+
 -- for repr formatting see the separate test_short_repr test in
 -- test_float.py.  Not all platforms use short repr for floats.
 
index a192ec45ac461413af5591fcaecc9f201453e7ce..a2f4ed505a66477140a564d762dbfde0e281c88a 100644 (file)
@@ -539,6 +539,25 @@ class ComplexTest(unittest.TestCase):
         # make sure everything works in ''.format()
         self.assertEqual('*{0:.3f}*'.format(3.14159+2.71828j), '*3.142+2.718j*')
 
+        # issue 3382: 'f' and 'F' with inf's and nan's
+        self.assertEqual('{0:f}'.format(INF+0j), 'inf+0.000000j')
+        self.assertEqual('{0:F}'.format(INF+0j), 'INF+0.000000j')
+        self.assertEqual('{0:f}'.format(-INF+0j), '-inf+0.000000j')
+        self.assertEqual('{0:F}'.format(-INF+0j), '-INF+0.000000j')
+        self.assertEqual('{0:f}'.format(complex(INF, INF)), 'inf+infj')
+        self.assertEqual('{0:F}'.format(complex(INF, INF)), 'INF+INFj')
+        self.assertEqual('{0:f}'.format(complex(INF, -INF)), 'inf-infj')
+        self.assertEqual('{0:F}'.format(complex(INF, -INF)), 'INF-INFj')
+        self.assertEqual('{0:f}'.format(complex(-INF, INF)), '-inf+infj')
+        self.assertEqual('{0:F}'.format(complex(-INF, INF)), '-INF+INFj')
+        self.assertEqual('{0:f}'.format(complex(-INF, -INF)), '-inf-infj')
+        self.assertEqual('{0:F}'.format(complex(-INF, -INF)), '-INF-INFj')
+
+        self.assertEqual('{0:f}'.format(complex(NAN, 0)), 'nan+0.000000j')
+        self.assertEqual('{0:F}'.format(complex(NAN, 0)), 'NAN+0.000000j')
+        self.assertEqual('{0:f}'.format(complex(NAN, NAN)), 'nan+nanj')
+        self.assertEqual('{0:F}'.format(complex(NAN, NAN)), 'NAN+NANj')
+
 def test_main():
     test_support.run_unittest(ComplexTest)
 
index 4e918fbb2ff7af01ca7924cb416964abecb7b2b6..3ad140288190e3afeb2516a889217be0b499161a 100644 (file)
@@ -309,6 +309,14 @@ class IEEEFormatTestCase(unittest.TestCase):
                 self.assertRaises(ValueError, format, 1e-100, format_spec)
                 self.assertRaises(ValueError, format, -1e-100, format_spec)
 
+        # issue 3382: 'f' and 'F' with inf's and nan's
+        self.assertEqual('{0:f}'.format(INF), 'inf')
+        self.assertEqual('{0:F}'.format(INF), 'INF')
+        self.assertEqual('{0:f}'.format(-INF), '-inf')
+        self.assertEqual('{0:F}'.format(-INF), '-INF')
+        self.assertEqual('{0:f}'.format(NAN), 'nan')
+        self.assertEqual('{0:F}'.format(NAN), 'NAN')
+
     @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
                          "test requires IEEE 754 doubles")
     def test_format_testfile(self):
@@ -321,8 +329,10 @@ class IEEEFormatTestCase(unittest.TestCase):
 
             lhs, rhs = map(str.strip, line.split('->'))
             fmt, arg = lhs.split()
-            self.assertEqual(fmt % float(arg), rhs)
-            self.assertEqual(fmt % -float(arg), '-' + rhs)
+            arg = float(arg)
+            self.assertEqual(fmt % arg, rhs)
+            if not math.isnan(arg) and copysign(1.0, arg) > 0.0:
+                self.assertEqual(fmt % -arg, '-' + rhs)
 
     def test_issue5864(self):
         self.assertEquals(format(123.456, '.4'), '123.5')
index 2d6b7f0b0224012a6df77f48ac39477c77641d0f..e5c8626777351ca87b30283982c905aeb26f8660 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,10 @@ What's New in Python 2.7 alpha 1
 Core and Builtins
 -----------------
 
+- Issue #3382: 'F' formatting for float and complex now convert the
+  result to upper case. This only affects 'inf' and 'nan', since 'f'
+  no longer converts to 'g' for large values.
+  
 - Remove switch from "%f" formatting to "%g" formatting for floats
   larger than 1e50 in absolute value.
 
index f09578fa13d7f5ac3fd6242c1a84bdfc74097008..f4a3ea3d58127c5caf3697d451b5b7364e4565db 100644 (file)
@@ -937,13 +937,6 @@ format_float_internal(PyObject *value,
            format the result. We take care of that later. */
         type = 'g';
 
-#if PY_VERSION_HEX < 0x0301000
-    /* 'F' is the same as 'f', per the PEP */
-    /* This is no longer the case in 3.x */
-    if (type == 'F')
-        type = 'f';
-#endif
-
     val = PyFloat_AsDouble(value);
     if (val == -1.0 && PyErr_Occurred())
         goto done;
@@ -1128,13 +1121,6 @@ format_complex_internal(PyObject *value,
            format the result. We take care of that later. */
         type = 'g';
 
-#if PY_VERSION_HEX < 0x03010000
-    /* This is no longer the case in 3.x */
-    /* 'F' is the same as 'f', per the PEP */
-    if (type == 'F')
-        type = 'f';
-#endif
-
     if (precision < 0)
         precision = default_precision;
 
index 6636b9af6d8ca68a4253b3bc3de5a9032d4c1a06..02aabf2e4299f81b104a8e016eee7d7c29331261 100644 (file)
@@ -4966,8 +4966,6 @@ PyString_Format(PyObject *format, PyObject *args)
                        case 'F':
                        case 'g':
                        case 'G':
-                               if (c == 'F')
-                                       c = 'f';
                                temp = formatfloat(v, flags, prec, c);
                                if (temp == NULL)
                                        goto error;
index 2fa004eae130ff8028dedb447c45c0b09a7faa3d..e85b20fa031686c11c82be7b397488cdbafca654 100644 (file)
@@ -8809,8 +8809,6 @@ PyObject *PyUnicode_Format(PyObject *format,
             case 'F':
             case 'g':
             case 'G':
-                if (c == 'F')
-                    c = 'f';
                 temp = formatfloat(v, flags, prec, c);
                 if (temp == NULL)
                     goto onError;