Почему numpy.мощность возвращает 0 для малых показателей при математике.pow возвращает правильный ответ?
In [25]: np.power(10,-100)
Out[25]: 0
In [26]: math.pow(10,-100)
Out[26]: 1e-100
Я ожидал бы, что обе команды вернут 1e-100. Это также не проблема точности, так как проблема сохраняется даже после увеличения точности до 500. Есть ли какие-то настройки, которые я могу изменить, чтобы получить правильный ответ?
3 ответа:
О, это гораздо "хуже", чем это:
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
метод numpy предполагает, что вы хотите вернуть целое число, так как вы указали целое число.
np.power(10.0,-100)
работает, как вы ожидаете.
(просто сноска к двум другим ответам на этой странице.)
учитывая входные два входных значения, вы можете проверить тип данных объекта, который
np.power
вернется, проверив :>>> 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
, совместимый-совместимый питон плавает мимоd
(документы).
np.power
эффективно решает, что возвращать, проверяя типы передаваемых аргументов и используя первую совпадающую подпись из этого списка.Итак, учитывая 10 и -100,
np.power
соответствуетinteger integer -> integer
подпись и возвращает целое число0
.С другой стороны, если один из аргументов имеет тип float, то целочисленный аргумент также будет приведен к float и
float float -> float
используется подпись (и возвращается правильное значение float).