mirror of https://github.com/python/cpython.git
Issue #5859: Remove '%f' to '%g' formatting switch for large floats.
This commit is contained in:
parent
f489caf5da
commit
33841c3489
|
@ -1321,9 +1321,9 @@ that ``'\0'`` is the end of the string.
|
|||
|
||||
.. 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:: 3.1
|
||||
``%f`` conversions for numbers whose absolute value is over 1e50 are no
|
||||
longer replaced by ``%g`` conversions.
|
||||
|
||||
.. index::
|
||||
module: string
|
||||
|
@ -2723,10 +2723,6 @@ The following attributes are only supported by :term:`new-style class`\ es.
|
|||
.. [#] 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
|
||||
|
|
|
@ -22,8 +22,8 @@
|
|||
%.0f 123.456 -> 123
|
||||
%.0f 1234.56 -> 1235
|
||||
%.0f 1e49 -> 9999999999999999464902769475481793196872414789632
|
||||
-- %.0f 1e50 -> 100000000000000007629769841091887003294964970946560
|
||||
%.0f 9.9999999999999987e+49 -> 99999999999999986860582406952576489172979654066176
|
||||
%.0f 1e50 -> 100000000000000007629769841091887003294964970946560
|
||||
|
||||
-- precision 1
|
||||
%.1f 0.0001 -> 0.0
|
||||
|
|
|
@ -538,10 +538,25 @@ def test(f, format_spec, result):
|
|||
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 <= 3.0 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.assert_(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.assert_(result[:12] in ('112340000000', '112339999999'))
|
||||
|
||||
|
||||
test( 1.0, 'e', '1.000000e+00')
|
||||
test(-1.0, 'e', '-1.000000e+00')
|
||||
|
|
|
@ -12,8 +12,10 @@ What's New in Python 3.1 beta 1?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #5859: Remove length restrictions for float formatting:
|
||||
'%.67f' % 12.34 and '%.120e' % 12.34 no longer raise an exception.
|
||||
- Issue #5859: Remove switch from '%f' to '%g'-style formatting for
|
||||
floats with absolute value over 1e50. Also remove length
|
||||
restrictions for float formatting: '%.67f' % 12.34 and '%.120e' %
|
||||
12.34 no longer raise an exception.
|
||||
|
||||
- Issue #1588: Add complex.__format__. For example,
|
||||
format(complex(1, 2./3), '.5') now produces a sensible result.
|
||||
|
|
|
@ -934,8 +934,6 @@ format_float_internal(PyObject *value,
|
|||
|
||||
if (precision < 0)
|
||||
precision = 6;
|
||||
if ((type == 'f' || type == 'F') && fabs(val) >= 1e50)
|
||||
type = 'g';
|
||||
|
||||
/* 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"
|
||||
|
|
|
@ -8808,9 +8808,6 @@ formatfloat(PyObject *v, int flags, int prec, int type)
|
|||
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)
|
||||
|
|
Loading…
Reference in New Issue