Python3中的整数溢出

kle*_*ium 4 python integer integer-overflow

我是Python的新手,我正在阅读这个页面,在那里我看到了一个奇怪的声明:

if n+1 == n:  # catch a value like 1e300
    raise OverflowError("n too large")
Run Code Online (Sandbox Code Playgroud)

x等于大于它的数字?!我感觉到了原力的干扰.

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

我认为这就是为什么结果n+1可能是相同的n:Python不能分配更多的内存来预先形成总和,所以它被跳过,并且n == n是真的.那是对的吗?

如果是这样,这可能导致程序的错误结果.为什么Python不能在操作不可能时引发错误,就像C++一样std::bad_alloc

即使n不是太大而且检查评估为假,result- 由于乘法 - 将需要更多的字节.可能result *= factor因同样的原因而失败?

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

kal*_*ann 23

蟒蛇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
Run Code Online (Sandbox Code Playgroud)

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

蟒蛇2

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

import sys

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

i += 1
print type(i)
# <type 'long'>
Run Code Online (Sandbox Code Playgroud)

result *= factor不能出于同样的原因?

为什么不试试呢?

import sys

i = 2
i *= sys.float_info.max
print i
# inf
Run Code Online (Sandbox Code Playgroud)

Python 有一个特殊的无穷大浮点值(以及负无穷大),如浮点数文档所述


The*_*Cat 9

我在 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
Run Code Online (Sandbox Code Playgroud)

某些 pandas 和 numpy 函数(例如sum数组或 Series)返回 np.int64,因此这可能是您在 Python3 中看到 int 溢出的原因。


har*_*old 5

整数在Python中不起作用.

但浮动确实如此.这也是评论说的原因1e300,这是科学记谱法中的一个浮点数.