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 文档中找到了它。检查大整数/可能的整数“溢出”真的是正确的方法吗?


慕虎7371278
浏览 274回答 3
3回答

慕哥9229398

蟒蛇3在python中只有浮点数有硬限制。整数被实现为在python3任意大小的“长”整数对象和通常不会溢出。您可以使用以下代码测试该行为import sysi = sys.maxsizeprint(i)# 9223372036854775807print(i == i + 1)# Falsei += 1print(i)# 9223372036854775808f = sys.float_info.maxprint(f)# 1.7976931348623157e+308print(f == f + 1)# Truef += 1print(f)# 1.7976931348623157e+308您可能还想看看sys.float_info和sys.maxsize蟒蛇2在 python2 中,如果如数字类型文档中所述过大,整数会自动转换为长整数import sysi = sys.maxsizeprint type(i)# <type 'int'>i += 1print type(i)# <type 'long'>能result *= factor不能出于同样的原因?为什么不试试呢?import sysi = 2i *= sys.float_info.maxprint i# infPython 有一个特殊的无穷大浮点值(以及负无穷大),如浮点数文档中所述

尚方宝剑之说

整数在 Python 中不是这样工作的。但是浮动可以。这也是为什么评论说1e300,这是科学记数法中的浮点数。

ibeautiful

我在python3中遇到了整数溢出的问题,但是当我检查类型时,我明白了原因:import numpy as npa = np.array([3095693933], dtype=int)s = np.sum(a)print(s)# 3095693933s * s# -8863423146896543127print(type(s))# numpy.int64py_s = int(s)py_s * py_s# 9583320926813008489一些sumPandas和 numpy 函数,例如在数组或系列上返回 np.int64,所以这可能是您在 Python3 中看到 int 溢出的原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python