[Python-Dev] Backport new float repr to Python 2.7?

Raymond Hettinger python at rcn.com
Sun Oct 11 21:44:01 CEST 2009


[Mark Dickinson]
> - string to float *and* float to string conversions are both guaranteed
>   correctly rounded in 3.x: David Gay's code implements the conversion
>   in both directions, and having correctly rounded string -> float
>   conversions is essential to ensure that eval(repr(x)) recovers x exactly.

IMO, that is so important that it should be considered a bug fix.
Recently, I lost a lot of time in a discussion about a piece of mathematical
code returning a wrong answer.  The problem wasn't the Python code;
instead, it was the str to float conversion (that we inherit from libc) giving
the wrong answer.  The code worked correctly under Py3.1 but not
Py2.6.

IDLE 2.6.2

>>> float('-30000000000000000477086733292797541405082425691835844169343982673243516316511143182440409957570445312.00000000000000000009000000000000000258695827614150149965556917147323765827915398318737061345018446445465087890625')
-2.9999999999999999e+100


Python 3.1.1 (r311:74483, Aug 17 2009, 17:02:12) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> float('-30000000000000000477086733292797541405082425691835844169343982673243516316511143182440409957570445312.00000000000000000009000000000000000258695827614150149965556917147323765827915398318737061345018446445465087890625')
-3.0000000000000002e+100


> - the repr of round(x, n) really does have at most n digits after the
>   point, giving the semi-illusion that x really has been rounded exactly,
>   and eliminating one of the most common user complaints about the
>   round function.

This is also an important improvement and makes round() do what
people expect.


> - side effects like finding that float(x) rounds correctly for
>   Decimal instances x.

This is also important because other decimal calculations can
often be done exactly and it's a bummer to have an accurate
result thrown off by an incorrect rounding to float.


> - the float <-> string conversions are under our control, so any bugs
>   found can be fixed in the Python source.  There's no shortage of
>   conversion bugs in the wild, and certainly bugs have been observed in
>   OS X, Linux and Windows.  (The ones I found in OS X 10.5 have
>   been fixed in OS X 10.6, though.)

Nice win.


> Thoughts?

+1

I've worked with the 3.1 float reprs for a while and have been delighted.
It was a great improvement.


Raymond 



More information about the Python-Dev mailing list