[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