[Python-checkins] r76472 - in python/trunk: Doc/library/stdtypes.rst Lib/test/test_types.py Misc/NEWS Objects/stringlib/formatter.h Objects/stringobject.c Objects/unicodeobject.c

mark.dickinson python-checkins at python.org
Mon Nov 23 21:54:09 CET 2009


Author: mark.dickinson
Date: Mon Nov 23 21:54:09 2009
New Revision: 76472

Log:
Issue #7117, continued: Remove substitution of %g-style formatting for
%f-style formatting, which used to occur at high precision.  Float formatting
should now be consistent between 2.7 and 3.1.


Modified:
   python/trunk/Doc/library/stdtypes.rst
   python/trunk/Lib/test/test_types.py
   python/trunk/Misc/NEWS
   python/trunk/Objects/stringlib/formatter.h
   python/trunk/Objects/stringobject.c
   python/trunk/Objects/unicodeobject.c

Modified: python/trunk/Doc/library/stdtypes.rst
==============================================================================
--- python/trunk/Doc/library/stdtypes.rst	(original)
+++ python/trunk/Doc/library/stdtypes.rst	Mon Nov 23 21:54:09 2009
@@ -1453,9 +1453,9 @@
 
 .. XXX Examples?
 
-For safety reasons, floating point precisions are clipped to 50; ``%f``
-conversions for numbers whose absolute value is over 1e50 are replaced by ``%g``
-conversions. [#]_  All other errors raise exceptions.
+.. versionchanged:: 2.7
+   ``%f`` conversions for numbers whose absolute value is over 1e50 are no
+   longer replaced by ``%g`` conversions.
 
 .. index::
    module: string
@@ -2875,10 +2875,6 @@
 .. [#] To format only a tuple you should therefore provide a singleton tuple whose only
    element is the tuple to be formatted.
 
-.. [#] These numbers are fairly arbitrary.  They are intended to avoid printing endless
-   strings of meaningless digits without hampering correct use and without having
-   to know the exact precision of floating point values on a particular machine.
-
 .. [#] The advantage of leaving the newline on is that returning an empty string is
    then an unambiguous EOF indication.  It is also possible (in cases where it
    might matter, for example, if you want to make an exact copy of a file while

Modified: python/trunk/Lib/test/test_types.py
==============================================================================
--- python/trunk/Lib/test/test_types.py	(original)
+++ python/trunk/Lib/test/test_types.py	Mon Nov 23 21:54:09 2009
@@ -601,10 +601,25 @@
         test(-1.0, ' f', '-1.000000')
         test( 1.0, '+f', '+1.000000')
         test(-1.0, '+f', '-1.000000')
-        test(1.1234e90, 'f', '1.1234e+90')
-        test(1.1234e90, 'F', '1.1234e+90')
-        test(1.1234e200, 'f', '1.1234e+200')
-        test(1.1234e200, 'F', '1.1234e+200')
+
+        # Python versions <= 2.6 switched from 'f' to 'g' formatting for
+        # values larger than 1e50.  No longer.
+        f = 1.1234e90
+        for fmt in 'f', 'F':
+            # don't do a direct equality check, since on some
+            # platforms only the first few digits of dtoa
+            # will be reliable
+            result = f.__format__(fmt)
+            self.assertEqual(len(result), 98)
+            self.assertEqual(result[-7], '.')
+            self.assertTrue(result[:12] in ('112340000000', '112339999999'))
+        f = 1.1234e200
+        for fmt in 'f', 'F':
+            result = f.__format__(fmt)
+            self.assertEqual(len(result), 208)
+            self.assertEqual(result[-7], '.')
+            self.assertTrue(result[:12] in ('112340000000', '112339999999'))
+
 
         test( 1.0, 'e', '1.000000e+00')
         test(-1.0, 'e', '-1.000000e+00')

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Mon Nov 23 21:54:09 2009
@@ -12,6 +12,9 @@
 Core and Builtins
 -----------------
 
+- Remove switch from "%f" formatting to "%g" formatting for floats
+  larger than 1e50 in absolute value.
+
 - Remove restrictions on precision when formatting floats.  E.g.,
   "%.120g" % 1e-100 used to raise OverflowError, but now gives the
   requested 120 significant digits instead.

Modified: python/trunk/Objects/stringlib/formatter.h
==============================================================================
--- python/trunk/Objects/stringlib/formatter.h	(original)
+++ python/trunk/Objects/stringlib/formatter.h	Mon Nov 23 21:54:09 2009
@@ -957,12 +957,6 @@
     if (precision < 0)
         precision = default_precision;
 
-#if PY_VERSION_HEX < 0x03010000
-    /* 3.1 no longer converts large 'f' to 'g'. */
-    if ((type == 'f' || type == 'F') && fabs(val) >= 1e50)
-        type = 'g';
-#endif
-
     /* Cast "type", because if we're in unicode we need to pass a
        8-bit char. This is safe, because we've restricted what "type"
        can be. */

Modified: python/trunk/Objects/stringobject.c
==============================================================================
--- python/trunk/Objects/stringobject.c	(original)
+++ python/trunk/Objects/stringobject.c	Mon Nov 23 21:54:09 2009
@@ -4398,9 +4398,6 @@
 	if (prec < 0)
 		prec = 6;
 
-	if (type == 'f' && fabs(x) >= 1e50)
-		type = 'g';
-
 	p = PyOS_double_to_string(x, type, prec,
 				  (flags & F_ALT) ? Py_DTSF_ALT : 0, NULL);
 

Modified: python/trunk/Objects/unicodeobject.c
==============================================================================
--- python/trunk/Objects/unicodeobject.c	(original)
+++ python/trunk/Objects/unicodeobject.c	Mon Nov 23 21:54:09 2009
@@ -8318,9 +8318,6 @@
     if (prec < 0)
         prec = 6;
 
-    if (type == 'f' && fabs(x) >= 1e50)
-        type = 'g';
-
     p = PyOS_double_to_string(x, type, prec,
                               (flags & F_ALT) ? Py_DTSF_ALT : 0, NULL);
     if (p == NULL)


More information about the Python-checkins mailing list