Python3中的整数溢出

时间:2018-09-03 14:22:47

标签: python integer integer-overflow

我是Python的新手,我在阅读this页面时看到了一个奇怪的陈述:

if n+1 == n:  # catch a value like 1e300
    raise OverflowError("n too large")

x等于大于它的数字吗?我感觉到警队受到干扰。

我知道在Python 3中,整数没有固定的字节长度。因此,没有整数溢出,就像C的int的工作方式一样。但是,内存当然不能存储无限的数据。

我认为这就是n+1的结果与n相同的原因:Python无法分配更多的内存来执行求和,因此跳过了该操作,而n == n是真正。正确吗?

如果这样,可能会导致程序错误。为什么在无法进行操作时Python不会引发错误,就像C ++的std::bad_alloc一样?

即使n不太大并且检查结果为false,由于相乘,result也将需要更多的字节。 result *= factor是否会因为相同的原因而失败?

我在官方Python文档中找到了它。检查大整数/可能的整数“溢出”真的是正确的方法吗?

3 个答案:

答案 0 :(得分:5)

整数在Python中无法正常工作。

但是浮点数确实如此。这就是为什么评论中提到1e300(这是科学计数法中的浮标)的原因。

答案 1 :(得分:3)

Python3

只有花车有  python中的硬限制。整数是are implemented as “long” integer objects of arbitrary size in python3do normally not overflow

您可以使用以下代码测试该行为

import sys

i = sys.maxsize
print(i)
# 9223372036854775807
print(i == i + 1)
# False
i += 1
print(i)
# 9223372036854775808

f = sys.float_info.max
print(f)
# 1.7976931348623157e+308
print(f == f + 1)
# True
f += 1
print(f)
# 1.7976931348623157e+308

您可能还想看看sys.float_infosys.maxsize

Python2

在python2中,如果documentation for numeric types中所述过大,整数将自动转换为长整数。

import sys

i = sys.maxsize
print type(i)
# <type 'int'>

i += 1
print type(i)
# <type 'long'>
  

result *= factor是否会因为相同的原因而失败?

为什么不尝试呢?

import sys

i = 2
i *= sys.float_info.max
print i
# inf

Python有一个特殊的float值,表示the docs for float中描述的无穷大(也有负无穷大)

答案 2 :(得分:0)

我在python3中遇到整数溢出问题,但是当我检查类型时,我明白了原因:

import numpy as np

a = np.array([3095693933], dtype=int)
s = np.sum(a)
print(s)
# 3095693933
s * s
# -8863423146896543127
print(type(s))
# numpy.int64
py_s = int(s)
py_s * py_s
# 9583320926813008489

一些熊猫和numpy函数,例如数组或Series上的sum返回np.int64,因此这可能就是您在Python3中看到int溢出的原因。