Я подозреваю, что numpy использует функцию divmod для вычисления деления по этажам, и строка, вызывающая это, здесь :
/* 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)
Я рассмотрел это немного подробнее, и вот как работает divmod в python для чисел с плавающей запятой, когда div равен нулю ( 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. Вы можете увидеть заметки о выпуске здесь .