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) == float
而 type(int(n/2)) == int
。或者,您可以使用 n // 2
,其中 //
执行 floor/integer 除法。
built-in pow
函数 returns a float
如果任一参数也是 float
。在内部,这些是 double-precision 浮点数,可以 store up to ~10308 – 比 22147483648/2 小得多,因此 OverflowError
.
在执行 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) == float
而 type(int(n/2)) == int
。或者,您可以使用 n // 2
,其中 //
执行 floor/integer 除法。
built-in pow
函数 returns a float
如果任一参数也是 float
。在内部,这些是 double-precision 浮点数,可以 store up to ~10308 – 比 22147483648/2 小得多,因此 OverflowError
.