Почему numpy.power возвращает 0 для малых показателей, а math.pow возвращает правильный ответ?
In [25]: np.power(10,-100)
Out[25]: 0
In [26]: math.pow(10,-100)
Out[26]: 1e-100
Я ожидаю, что обе команды вернут 1е-100. Это тоже не проблема, так как проблема сохраняется даже после повышения точности до 500. Есть ли какая-то настройка, которую я могу изменить, чтобы получить правильный ответ?
Ответы
Ответ 1
О, это намного "хуже", чем это:
In [2]: numpy.power(10,-1)
Out[2]: 0
Но это намек на то, что происходит: 10
- целое число, а numpy.power
не принуждает числа к плавающим. Но это работает:
In [3]: numpy.power(10.,-1)
Out[3]: 0.10000000000000001
In [4]: numpy.power(10.,-100)
Out[4]: 1e-100
Обратите внимание, однако, что оператор мощности **
преобразуется в float:
In [5]: 10**-1
Out[5]: 0.1
Ответ 2
Метод numpy предполагает, что вы хотите, чтобы целое число возвращалось с момента ввода целого числа.
np.power(10.0,-100)
работает так, как вы ожидали.
Ответ 3
(Только примечание к двум другим ответам на этой странице.)
Для ввода двух входных значений вы можете проверить тип данных объекта, который np.power
вернется, проверив атрибут types
:
>>> np.power.types
['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L', 'qq->q',
'QQ->Q', 'ee->e', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D', 'GG->G', 'OO->O']
Целочисленные типы, совместимые с Python, обозначаются символами l
, совместимыми с Python платами d
().
np.power
эффективно решает, что возвращать, проверяя типы переданных аргументов и используя первую соответствующую подпись из этого списка.
Итак, заданные 10 и -100, np.power
соответствуют подписи integer integer -> integer
и возвращают целое число 0
.
С другой стороны, если один из аргументов является float, то аргумент integer также будет перенесен в float, а float float -> float
(и возвращается правильное значение float).