Подтвердить что ты не робот

Почему 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. Есть ли какая-то настройка, которую я могу изменить, чтобы получить правильный ответ?

4b9b3361

Ответ 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).