[Numpy-discussion] round / set_printoptions discrepancy

Allan Haldane allanhaldane at gmail.com
Fri Sep 13 18:27:51 EDT 2019


On 9/13/19 9:26 AM, Eric Moore wrote:
> See the notes section here.  
> https://numpy.org/devdocs/reference/generated/numpy.around.html.
> 
> This note was recently added in https://github.com/numpy/numpy/pull/14392
> 
> Eric

Hmm, but this example with 16.055 shows the note still isn't quite right.

The doc suggests that the floating point error only matters for large
values or large `decimals`, but this shows it also happens for small
values. Makes sense now that I see the example.

We should tweak the docstring.

Also, I did make some notes in
https://github.com/numpy/numpy/issues/14391
for how we could "fix" this problem efficiently. Unfortunately it's far
from trivial to write a correct rounding algorithm, and I'm not sure
it's worth the effort: The round error is comparable to normal
floating-point error, and I don't think round is heavily used.

Best,
Allan


> On Fri, Sep 13, 2019 at 9:20 AM Andras Deak <deak.andris at gmail.com
> <mailto:deak.andris at gmail.com>> wrote:
> 
>     On Fri, Sep 13, 2019 at 2:59 PM Philip Hodge <hodge at stsci.edu
>     <mailto:hodge at stsci.edu>> wrote:
>     >
>     > On 9/13/19 8:45 AM, Irvin Probst wrote:
>     > > On 13/09/2019 14:05, Philip Hodge wrote:
>     > >>
>     > >> Isn't that just for consistency with Python 3 round()?  I agree
>     that
>     > >> the discrepancy with np.set_printoptions is not necessarily
>     expected,
>     > >> except possibly for backwards compatibility.
>     > >>
>     > >>
>     > >
>     > > I've just checked and np.set_printoptions behaves as python's round:
>     > >
>     > > >>> round(16.055,2)
>     > > 16.05
>     > > >>> np.round(16.055,2)
>     > > 16.06
>     > >
>     > > I don't know why round and np.round do not behave the same,
>     actually I
>     > > would even dare to say that I don't care :-)
>     > > However np.round and np.set_printoptions should provide the same
>     > > output, shouldn't they ? This discrepancy is really disturbing
>     whereas
>     > > consistency with python's round looks like the icing on the cake but
>     > > in no way a required feature.
>     > >
>     >
>     > Python round() is supposed to round to the nearest even value, if the
>     > two closest values are equally close.  So round(16.055, 2) returning
>     > 16.05 was a surprise to me.  I checked the documentation and found a
>     > note that explained that this was because "most decimal fractions
>     can't
>     > be represented exactly as a float."  round(16.55) returns 16.6.
>     >
>     > Phil
>     >
>     > _______________________________________________
>     > NumPy-Discussion mailing list
>     > NumPy-Discussion at python.org <mailto:NumPy-Discussion at python.org>
>     > https://mail.python.org/mailman/listinfo/numpy-discussion
> 
>     Ah, of course, endless double-precision shenanigans...
>     >>> format(16.055, '.30f')
>     '16.054999999999999715782905695960'
> 
>     >>> format(16.55, '.30f')
>     '16.550000000000000710542735760100'
> 
>     András
>     _______________________________________________
>     NumPy-Discussion mailing list
>     NumPy-Discussion at python.org <mailto:NumPy-Discussion at python.org>
>     https://mail.python.org/mailman/listinfo/numpy-discussion
> 
> 
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at python.org
> https://mail.python.org/mailman/listinfo/numpy-discussion
> 



More information about the NumPy-Discussion mailing list