OverflowError: (34, 'Numerical result out of range') in writing a custom implementation of pow(x,n)

OverflowError: (34, 'Numerical result out of range') in writing a custom implementation of pow(x,n)

在执行 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)

由于 Whosebug,我无法弄清楚 cause.Is,因为 python 解释器不处理尾递归优化,并且返回的结果被保留,因为它稍后会被进一步使用计算。

我很想知道为什么这两种情况不同。

返回值的大小post计算太大,即使是浮点变量也无法存储,因此它会因 OverFlowError 异常而出错

/ in Python 3.x 总是执行 浮点数 除法,不像 Python 2.x where操作数必须显式转换。因此 type(n/2) == floattype(int(n/2)) == int。或者,您可以使用 n // 2,其中 // 执行 floor/integer 除法。

built-in pow 函数 returns a float 如果任一参数也是 float。在内部,这些是 double-precision 浮点数,可以 store up to ~10308 – 比 22147483648/2 小得多,因此 OverflowError.