【问题标题】:Integer overflow in Python3Python3中的整数溢出
【发布时间】: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


【解决方案1】:

Python3

只有花车有 python中的硬限制。整数是are implemented as “long” integer objects of arbitrary size in python3do not normally overflow

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

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

Python2

在 python2 中,如果如documentation for numeric types 中所述,如果太大,整数会自动转换为长整数

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

the docs for float 中所述,Python 有一个特殊的无穷大浮点值(也有负无穷大)

【讨论】:

  • 我接受了你的回答,因为它尊重MemoryError(我不知道),如果我尝试使用太大的整数,就会引发这种情况。
  • 顺便说一句,我的第三个问题是针对大整数,而不是小(以位为单位)浮点数。我不想尝试使用超过 100k 位的数字。 :) 知道它在理论上是如何工作的就足够了。
  • 谢谢,很高兴能帮到你
  • 不错! (更多字符)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 2022-01-07
      • 2014-01-24
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多