Weird результат деления с в NumPy

Вопрос задан: 1 год назад Последняя активность: 1 год назад
up 13 down

Я наткнулся на результат пол дивизиона np.float32 или np.float64, которые я не понимаю

Я использую NumPy 1.15.4 в Python 3.6.7

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

Я знаю, что я могу обойти с помощью ABS(), и такие, но почему я получаю «-0.0» вместо «0.0» в первую очередь ??

1 ответ

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 9 down accepted

Я подозреваю, что NumPy использует функцию divmod для вычисления деления пола и линия причиной этого является вот:

/* if div is zero ensure correct sign */
floordiv = (a / b > 0) ? [email protected]@ : [email protected]@;

Пример:

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

Питона divmod функция, кажется, правильно обращаться с этим, поэтому они должны быть с использованием различных алгоритмов:

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

Я посмотрел на это немного больше, а вот как 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);
    }
}

так что причина питон может получить это право и NumPy не является то, что питон использует atan2() различать -0.0 а также +0.0.

Обновление: Эта проблема будет исправлена ​​в выпуске NumPy 1.17.0. Вы можете увидеть примечание к выпуску вот.

Ошибка 505

Что-то пошло не так

Попробуйте воспользоваться поиском