# [Numpy-discussion] Behavior of rint?

Charles R Harris charlesr.harris at gmail.com
Fri Jan 19 10:50:55 EST 2018

```On Fri, Jan 19, 2018 at 8:45 AM, Charles R Harris <charlesr.harris at gmail.com
> wrote:

>
>
> On Fri, Jan 19, 2018 at 8:27 AM, Matthew Brett <matthew.brett at gmail.com>
> wrote:
>
>> Hi,
>>
>> On Fri, Jan 19, 2018 at 3:24 PM, Charles R Harris
>> <charlesr.harris at gmail.com> wrote:
>> >
>> >
>> > On Fri, Jan 19, 2018 at 7:48 AM, Matthew Brett <matthew.brett at gmail.com
>> >
>> > wrote:
>> >>
>> >> Hi Chuck,
>> >>
>> >> Thanks for the replies, they are very helpful.
>> >>
>> >> On Fri, Jan 19, 2018 at 1:51 PM, Charles R Harris
>> >> <charlesr.harris at gmail.com> wrote:
>> >> >
>> >> >
>> >> > On Fri, Jan 19, 2018 at 6:41 AM, Charles R Harris
>> >> > <charlesr.harris at gmail.com> wrote:
>> >> >>
>> >> >>
>> >> >>
>> >> >> On Fri, Jan 19, 2018 at 3:30 AM, Matthew Brett
>> >> >> <matthew.brett at gmail.com>
>> >> >> wrote:
>> >> >>>
>> >> >>> Hi,
>> >> >>>
>> >> >>> Sorry for my confusion, but I noticed (as a result of the
>> discussion
>> >> >>> here [1]) that np.rint and the fallback C function [2] seem to
>> round
>> >> >>> to even.  But - my impression was that C rint, by default, rounds
>> down
>> >> >>> [3].   Is numpy rint not behaving the same way as the GNU C library
>> >> >>> rint?
>> >> >>>
>> >> >>> In [4]: np.rint(np.arange(0.5, 11))
>> >> >>> Out[4]: array([ 0.,  2.,  2.,  4.,  4.,  6.,  6.,  8.,  8., 10.,
>> 10.])
>> >> >>>
>> >> >>> In [5]: np.round(np.arange(0.5, 11))
>> >> >>> Out[5]: array([ 0.,  2.,  2.,  4.,  4.,  6.,  6.,  8.,  8., 10.,
>> 10.])
>> >> >>
>> >> >>
>> >> >> The GNU C documentation says that rint "round(s) x to an integer
>> value
>> >> >> according to the current rounding mode." The rounding mode is
>> >> >> determined by
>> >> >> settings in the FPU control word. Numpy runs with it set to round to
>> >> >> even,
>> >> >> although, IIRC, there is a bug on windows where the library is not
>> >> >> setting
>> >> >> those  bits correctly.
>> >> >
>> >> >
>> >> > Round to even is also the Python default rounding mode.
>> >>
>> >> Do you mean that it is Python setting the FPU control word?  Or do we
>> >> set it?  Do you happen to know where that is in the source?  I did a
>> >> quick grep just now without anything obvious.
>> >
>> >
>> > I can't find official (PEP) documentation, but googling indicates that
>> in
>> > Python 3, `round` rounds to even, and in Python 2 it rounds up. See also
>> > https://docs.python.org/3/whatsnew/3.0.html.
>>
>> But I guess this could be the Python implementation of round, rather
>> than rint and the FPU control word?  I'm asking because the question
>> arose about npy_rint at the C level ...
>>
>
> I'm pretty sure Python sets the FPU control word. Note that Python itself
> doesn't have a public interface for setting it, nor does Java. The GNU
> library documentation has the following:
>
> Round to nearest.
> This is the default mode. It should be used unless there is a specific
> need for one of the others. In this mode results are rounded to the nearest
> representable value. If the result is midway between two representable
> values, the even representable is chosen. *Even* here means the
> lowest-order bit is zero. This rounding mode prevents statistical bias and
> guarantees numeric stability: round-off errors in a lengthy calculation
> will remain smaller than half of FLT_EPSILON.
>
>
A classic reference for rounding is TAOCP (section 4.2.2 in the Third
Edition). I read that many years ago, so don't recall the details.

Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20180119/0becc4ca/attachment-0001.html>
```