Разница между встроенным в Python pow и math pow для больших целых чисел

Я обнаружил, что для больших целых чисел math.pow не удается успешно преобразовать в свою целочисленную версию. У меня возникла ошибка умножения Карацубы при реализации с math.pow.

Например:

>>> a_Size=32
>>> pow(10,a_size) * 1024
102400000000000000000000000000000000
>>> math.pow(10,a_size) * 1024
1.024e+35
>>> int(math.pow(10,a_size) * 1024)
102400000000000005494950097298915328

Я выбрал 10 ** a_size с правильными результатами для больших целых чисел.

Информацию о поплавках см. На странице Разница между встроенные функции pow () и math.pow () для чисел с плавающей запятой в Python?

Пожалуйста, объясните, почему наблюдается это несоответствие для math.pow. Наблюдается только с 10 степени 23 и выше.


person Rock    schedule 10.10.2016    source источник
comment
pow(float(10), 32) * 1024 -> 1.024e+35, ответ находится в вопросе, с которым вы связались, math.pow () неявно преобразует свои аргументы в float:   -  person Padraic Cunningham    schedule 10.10.2016
comment
help(math) Он обеспечивает доступ к математическим функциям, определенным стандартом C.   -  person Nizam Mohamed    schedule 10.10.2016
comment
В отличие от встроенного оператора **, math.pow () преобразует оба своих аргумента в тип float. Используйте ** или встроенную функцию pow () для вычисления точных целочисленных степеней. https://docs.python.org/3/library/math.html#math.pow   -  person Nizam Mohamed    schedule 10.10.2016


Ответы (1)


math.pow() всегда возвращает число с плавающей запятой, поэтому вы ограничены точностью float (почти всегда число двойной точности IEEE 754). С другой стороны, встроенный pow() будет использовать целочисленную арифметику произвольной точности Python при вызове с целочисленными аргументами.

person Sven Marnach    schedule 10.10.2016