为了账号安全,请及时绑定邮箱和手机立即绑定

Python3中的整数溢出

Python3中的整数溢出

慕虎7371278 2021-06-04 14:49:25
我是 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 文档中找到了它。检查大整数/可能的整数“溢出”真的是正确的方法吗?
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

蟒蛇3

在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_info和sys.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 有一个特殊的无穷大浮点值(以及负无穷大),如浮点数文档中所述


查看完整回答
反对 回复 2021-06-09
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2021-06-09
?
ibeautiful

TA贡献1993条经验 获得超5个赞

我在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

一些sumPandas和 numpy 函数,例如在数组或系列上返回 np.int64,所以这可能是您在 Python3 中看到 int 溢出的原因。


查看完整回答
反对 回复 2021-06-09
  • 3 回答
  • 0 关注
  • 269 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信