При реализации pow (x, n) для (x = 2 и n = -2147483648) я получаю следующую ошибку:
Код:
class Solution:
def myPow(self, x, n):
flag = n < 0
n = -1 * n if flag else n
ans = None
if n % 2 == 0:
t = pow(x, n/2)
ans = t*t
else:
t = pow(x, (n-1)/2)
ans = x * t * t
return (1/ans) if flag else ans
if __name__ == "__main__":
Solution().myPow(2,-2147483648)
Traceback (most recent call last):
File "pw.py", line 16, in <module>
Solution().myPow(2,-2147483648)
File "pw.py", line 8, in myPow
t = pow(x, n/2)
OverflowError: (34, 'Numerical result out of range')
Однако, когда я реализую то же самое с n / 2 и (n-1) / 2, приведенным к типу int, как показано ниже, фрагмент кода я получаю 0.0 в качестве вывода:
class Solution:
def myPow(self, x, n):
flag = n < 0
n = -1 * n if flag else n
ans = None
if n % 2 == 0:
t = pow(x, int(n/2))
ans = t*t
else:
t = pow(x, int((n-1)/2))
ans = x * t * t
return (1/ans) if flag else ans
if __name__ == "__main__":
Solution().myPow(2,-2147483648)
Я не могу выяснить причину. Это из-за переполнения стека, поскольку интерпретатор python не обрабатывает оптимизацию хвостовой рекурсии, а возвращаемый результат сохраняется, поскольку он используется позже для дальнейших вычислений.
Мне любопытно узнать, почему эти два случая различаются.