Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x OverflowerError:(34,‘数值结果超出范围’)用于编写pow(x,n)的自定义实现_Python 3.x_Algorithm_Recursion_Tail Recursion - Fatal编程技术网

Python 3.x OverflowerError:(34,‘数值结果超出范围’)用于编写pow(x,n)的自定义实现

Python 3.x OverflowerError:(34,‘数值结果超出范围’)用于编写pow(x,n)的自定义实现,python-3.x,algorithm,recursion,tail-recursion,Python 3.x,Algorithm,Recursion,Tail Recursion,在为x=2和n=-2147483648实现powx,n时,我得到以下错误: 代码: 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:

在为x=2和n=-2147483648实现powx,n时,我得到以下错误:

代码:

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)
但是,当我使用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解释器不处理尾部递归优化,并且返回的结果将被持久化,因为它稍后将用于进一步的计算


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

计算后返回的值太大,即使对于浮点变量也无法存储,因此它会出错并出现溢出错误或异常。

计算后返回的值太大,即使对于浮点变量也无法存储,因此它会出错Python3.x中的OverflowerError异常始终执行浮点除法,而Python2.x中的操作数必须显式强制转换。因此,typen/2==float,而typeintn/2==int。或者,您可以使用n//2,其中//执行floor/整数除法

如果两个参数中的任何一个也是浮点,则内置pow函数将返回浮点。在内部,这些是双精度浮点数,可以–比22147483648/2小得多,因此溢出错误。

/Python3.x中始终执行浮点除法,而Python2.x中的操作数必须显式强制转换。因此,typen/2==float,而typeintn/2==int。或者,您可以使用n//2,其中//执行floor/整数除法


如果两个参数中的任何一个也是浮点,则内置pow函数将返回浮点。在内部,这些是双精度浮点数,可以–比22147483648/2小得多,因此出现溢出错误。

我认为错误不是由于stackoverflow,而是由于int数据类型容纳大量数字的能力。您忘记实现基本情况。当n==1或0时会发生什么情况?n/2或赋值不太可能出错。您确定这是您的实际代码吗?我觉得这里少了些什么。也许我遗漏了什么?@MadPhysicast注意到OP正在递归调用内置pow而不是myPow-可能是一个输入错误,但仍然值得调查以供将来参考。我认为错误不是由于堆栈溢出,而是由于int数据类型容纳大数的能力。您忘记了实现基本情况。当n==1或0时会发生什么情况?n/2或赋值不太可能出错。您确定这是您的实际代码吗?我觉得这里少了些什么。也许我遗漏了什么?@MadPhysician注意到OP是递归调用内置pow而不是myPow-可能是一个输入错误,但仍然值得研究以供将来参考。当我将幂型转换为int时,在这种情况下不会损失精度,异常没有发生。当我将powers类型转换为int(在这种情况下不会丢失精度)时,异常没有发生。
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)