numpy.rint没有按预期工作

时间:2014-01-03 10:55:24

标签: python math numpy scipy

我试图找到这个结果的原因:

import numpy
result1 = numpy.rint(1.5)
result2 = numpy.rint(6.5)
print result

输出:

result1-> 2
result2-> 6

这很奇怪: result1 是正确的但我 result2 不是(它必须是7因为 rint 将任何浮动舍入到{{ 3}})。

有什么想法吗? (谢谢!)

2 个答案:

答案 0 :(得分:7)

来自numpy's documentation on numpy.around, equivalent to numpy.round,据称也与numpy.rint相关:

  

对于正好在舍入小数值之间的值,Numpy   舍入到最接近的偶数值。因此1.5和2.5轮到2.0,-0.5   由于这个原因,结果也可能是令人惊讶的   IEEE浮点中小数部分的不精确表示   标准[R9]和以10的幂进行缩放时引入的错误。

同样相关:虽然对于大数字可能存在表示错误,但对于小值,半整数在二进制基础浮点中可以精确表示,特别是1.56.5在标准单个中是完全可表示的-precision漂浮。如果没有奇数,偶数,低位,高位整数或任何其他方案的偏好,那么这里就会有未定义的行为。

正如@wim在评论中指出的那样,Python的内置round的行为是不同的。它远离零:它更喜欢正整数的上整数和负输入的较低整数。 (见http://docs.python.org/2/library/functions.html#round

答案 1 :(得分:0)

我认为这是拇指的规则 - 当你在两个整数之间有一个浮点数时,就像1.5位于1到2之间的中间位置,因为两个选项同样好,所以我们更喜欢舍入到偶数(这是2在这种情况下)和6.5,它位于6到7的中间,6是最接近的偶数。