Почему 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 52

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).