On 9/3/06, Sebastian Haase <haase@msg.ucsf.edu> wrote:
Hi,
I just learn about the existence of round().
Is the following exposing a bug?
>>> N.__version__
'1.0b4'
>>> N.array([65.0])
[ 65.]
>>> _.round(-1)
[ 60.]
>>> round(65, -1)
70.0
>>> N.array([65])
[65]
>>> _.round(-1)
[60]
>>> N.array([66])
[66]
>>> _.round(-1)
[60]
>>> N.array([66.2])
[ 66.2]
>>> _.round(-1)
[ 70.]

65 should round *up* to 70. (when decimals is given as -1)
In numpy even 66 rounds down, but 66.2 rounds up ...

Numpy rounds to even.

>>> around(arange(10)*.5)
array([ 0.,  0.,  1.,  2.,  2.,  2.,  3.,  4.,  4.,  4.])

i.e., when at those x.5 boundaries, round to the nearest even number. Always rounding in the same direction biases the numbers when you have gazillions of them. This is most likely of import when the fpu is rounding intermediate results to register length, but numpy does it too. Floats can be weird anyway, .15, for instance, can't be represented exactly as an ieee float. It does tend to throw folks for a loop when they don't keep this in mind.

- Sebastian Haase

Chuck