numpy中的楼层划分的奇怪结果

时间:2019-01-23 16:38:42

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

我偶然发现了np.float32或np.float64的下限分割结果,

我正在Python 3.6.7中使用numpy 1.15.4

 new Thread(new Runnable() {

            @Override public void run() {

                //I'm in the thread.

                //if you are not in the Activity, pass the activity instance to your class
                // and use myActivity.runOnUiThread(...)
                runOnUiThread(new Runnable() {

                    @Override public void run() {

                        //I'm in the main thread
                    }
                });

            }
        }).start();

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

1 个答案:

答案 0 :(得分:9)

我怀疑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为零(link)时python的divmod用于浮点数的方法:

/* 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