在执行 pow(x, n) 时,对于 (x=2,and 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)
我无法找出原因。这是由于stackoverflow造成的吗,因为python解释器不处理尾递归优化,并且返回的结果被保留,因为它稍后用于进一步计算。
我很好奇为什么这两种情况不同。
/
始终执行 浮点 除法,这与必须显式转换操作数的 Python 2.x 不同。因此 type(n/2) == float
而 type(int(n/2)) == int
。或者,您可以使用 n // 2
,其中 //
执行向下/整数除法。
如果任一参数也是
pow
,则内置 float
函数将返回 float
。在内部,这些是双精度浮点数,最多可以存储 ~10308 – 远小于 22147483648/2,因此 OverflowError
。
if n<0:
n=n*(-1)
return self.pow(1/x,n)
return self.pow(x,n)