【问题标题】:Weird result of floor division in numpynumpy中地板除法的奇怪结果
【发布时间】:2019-06-17 07:32:16
【问题描述】:

我偶然发现了 np.float32 或 np.float64 的地板除法结果,我不明白

我在 Python 3.6.7 中使用 numpy 1.15.4

>>> import numpy as np
>>> np.float32(0)//1
-0.0

我知道,我可以通过 abs() 等解决方法,但为什么我首先得到的是“-0.0”而不是“0.0”??

【问题讨论】:

  • negative zero in python的可能重复
  • @DDS 我不能 100% 确定这解决了 OP 的问题。
  • @DDS 该链接没有解释这样一个事实,即香草 Python 等效于 0.0//1 == 0.0 而不是 -0.0
  • @ScottBoston 它是相关的,但我认为这并不能解释为什么 (+0.0) // 1 == -0.0... 尤其是考虑到 NumPy 会发生这种情况,但 Python 浮点值不会发生这种情况。

标签: python python-3.x numpy floor-division


【解决方案1】:

我怀疑 numpy 使用 divmod 函数来计算楼层划分,导致这种情况的行是here

/* if div is zero ensure correct sign */
floordiv = (a / b > 0) ? 0.0@c@ : -0.0@c@;

例子:

>>> a = np.zeros(1)
>>> b = 1
>>> np.where(a/b > 0, 0.0, -0.0)
array([-0.])

Python 的 divmod 函数似乎可以正确处理此问题,因此它们必须使用不同的算法:

>>> divmod(0.0,1)
(0.0, 0.0)
>>> divmod(-0.0,1)
(-0.0, 0.0)

我对此进行了更多研究,以下是当 div 为零时,python 的 divmod 如何处理浮点数 (link):

/* div is zero - get the same sign as the true quotient */
floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */

copysign() 定义为:

double
copysign(double x, double y)
{
    /* use atan2 to distinguish -0. from 0. */
    if (y > 0. || (y == 0. && atan2(y, -1.) > 0.)) {
        return fabs(x);
    } else {
        return -fabs(x);
    }
}

所以python能够做到这一点而numpy不能做到这一点的原因是python使用atan2()来区分-0.0+0.0

更新:这个问题将在 numpy 的 1.17.0 版本中修复。您可以查看发行说明here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    相关资源
    最近更新 更多