在编写 pow(x,n) 的自定义实现时出现溢出错误:(34,“数值结果超出范围”)

问题描述 投票:0回答:3

在执行 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 python-3.x algorithm recursion tail-recursion
3个回答
3
投票
Python 3.x 中的

/
始终执行 浮点 除法,这与必须显式转换操作数的 Python 2.x 不同。因此
type(n/2) == float
type(int(n/2)) == int
。或者,您可以使用
n // 2
,其中
//
执行向下/整数除法。

如果任一参数也是

pow
,则内置
float
函数将返回
float
。在内部,这些是双精度浮点数,最多可以存储 ~10308 – 远小于 22147483648/2,因此 OverflowError


3
投票
计算后返回的值的大小太大,即使对于浮点变量也无法存储,因此会出现 OverFlowError Exception 错误


0
投票
if n<0: n=n*(-1) return self.pow(1/x,n) return self.pow(x,n)
    
© www.soinside.com 2019 - 2024. All rights reserved.