Mic*_*hal 13 python numpy python-3.x floor-division
我偶然发现了np.float32或np.float64的分区结果,我不明白
我在Python 3.6.7中使用numpy 1.15.4
>>> import numpy as np
>>> np.float32(0)//1
-0.0
Run Code Online (Sandbox Code Playgroud)
我知道,我可以通过abs()等解决方法,但为什么我首先得到"-0.0"而不是"0.0"?
我怀疑numpy使用divmod函数来计算楼层划分,导致这一点的行在这里:
/* if div is zero ensure correct sign */
floordiv = (a / b > 0) ? 0.0@c@ : -0.0@c@;
Run Code Online (Sandbox Code Playgroud)
例:
>>> a = np.zeros(1)
>>> b = 1
>>> np.where(a/b > 0, 0.0, -0.0)
array([-0.])
Run Code Online (Sandbox Code Playgroud)
Python的divmod功能似乎正确处理,所以他们必须使用不同的算法:
>>> divmod(0.0,1)
(0.0, 0.0)
>>> divmod(-0.0,1)
(-0.0, 0.0)
Run Code Online (Sandbox Code Playgroud)
我更多地研究了这一点,这里是当div为零时,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 */
Run Code Online (Sandbox Code Playgroud)
并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);
}
}
Run Code Online (Sandbox Code Playgroud)
所以python能够得到这个权利和numpy的原因不是python atan2()用来区分-0.0和+0.0.
更新:此问题将在numpy的1.17.0版本中修复.您可以在此处查看发行说明.
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |