【发布时间】:2018-09-03 14:22:47
【问题描述】:
我是 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 是真的。对吗?
如果是这样,这可能会导致程序的错误结果。为什么不能像 C++ 的 std::bad_alloc 那样操作时 Python 不报错?
即使n 不是太大并且检查结果为假,result - 由于乘法 - 也需要更多字节。 result *= factor 会因为同样的原因而失败吗?
我在官方 Python 文档中找到了它。检查大整数/可能的整数“溢出”真的是正确的方法吗?
【问题讨论】:
-
n == n 是真的。我假设你的意思是 n == (n+1)
-
该代码实际上并没有像 1e300 那样捕获大的
ints。由于内存原因,int 必须非常大才能发生这种情况。出于显而易见的原因,它确实捕获了浮动。 n 必须是浮点数。 -
@E.Serra 不,我不知道。我的意思是如果
n (+1)中的求和被跳过,它可能只看到和使用(n) (==) (n)。 -
@Denziloe 确实,我的错。我们在数学中也经常使用 'e' 表示整数,但在 Python 中我们可能会使用
**运算符来获取大整数。 -
好吧,文档中的这个函数捕获了
1e16,但接受了10 ** 5000000,我认为这很糟糕,因为1e16 < 10 ** 50所以检查只针对浮点输入(没有隐式转换) .
标签: python integer integer-overflow