Python3 中的整数溢出

新手上路,请多包涵

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

 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 不是太大并且检查评估为假, result - 由于乘法 - 将需要更多字节。 result *= factor 会因为同样的原因而失败吗?

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

原文由 klenium 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 864
2 个回答

Python3

只有浮点数在 python 中有硬性限制。整数 在 python3 中被实现为任意大小的“长”整数对象, 并且 通常不会溢出

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

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

蟒蛇2

在 python2 中,如果整数如 数字类型文档 中所述太大,则会自动转换为长整数

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 值表示无穷大(也有负无穷大),如 float 文档中所述

原文由 kalehmann 发布,翻译遵循 CC BY-SA 4.0 许可协议

整数在 Python 中不是这样工作的。

但浮动确实如此。这也是为什么评论说 1e300 ,这是科学记数法中的浮点数。

原文由 harold 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题