【问题标题】:Python: Error 34: Integer overflow (beginner)Python:错误 34:整数溢出(初学者)
【发布时间】:2018-07-20 13:31:43
【问题描述】:

我必须在我的程序中处理非常大的整数,但出现以下错误:

    Traceback (most recent call last):
  File "[path]", line n, in <module>
    number = int(numbers[0]*(10**numbers[1]))
OverflowError: (34, 'Numerical result out of range')

number = int(n)当我输入 8e10000000 作为 n.

有没有办法解决这个问题? 提前致谢。

【问题讨论】:

  • 为什么需要处理这么大的数字? 8e10000000 是一个巨大的数字
  • 您提供的代码 (number = int(8e10000000)) 与回溯中出现的代码 (number = int(numbers[0]*(10**numbers[1]))) 不同,因为第一个涉及浮点数,而第二个涉及浮点数仅使用整数。请澄清您的问题。

标签: python python-3.x integer overflow integer-overflow


【解决方案1】:

数字8e10000000 不是整数,它是 Python 的浮点数。使用e 表示法的任何数字都被视为浮点数。 Python(通常)使用 64 位浮点格式,不能容纳这么大的数字。

所以问题不是整数,而是你开始的浮点数。错误不在number = int(n) 行,而是在n = 8e10000000 行或您使用的任何等效项。

您可以通过使用来避免该错误

n = 8 * 10**10000000

这会产生一个整数。但要小心——在 RAM 中构建整数需要大量时间和内存。 (我的系统执行该命令需要 19 秒。)如果您尝试打印该值,计算机将花费 非常长时间 和大量内存来构建字符串值打印出来。

最后,正如其他人所指出的,您声称的声明与错误消息不匹配。因此,有可能发生了其他事情。如果您希望我们关闭,请显示显示该错误的完整代码 sn-p。

【讨论】:

    【解决方案2】:

    8e10000000 是一个非常大的数字,Python 表示它是一个浮点数。
    CPython 通常将这个浮点数存储为 64 位大小,对于这么大的数字来说太小了。

    对于如此大的数字,使用Decimal 模块是安全的:

    import sys
    from decimal import Decimal
    
    print('max size = ', sys.maxsize)
    number = Decimal("8e10000000")
    print(number)
    

    输出:

    max size =  9223372036854775807
    8E+10000000
    

    数字 9223372036854775807 正好是 2^63 - 1。

    【讨论】:

    • 在 Python 3 中,没有个最大整数。 sys.maxsize 返回“一个整数,给出 Py_ssize_t 类型的变量可以采用的最大值。在 32 位平台上通常是 2* *31 - 1,在 64 位平台上通常是 2**63 - 1。”,这个与问题完全无关。
    • @ThierryLathuille 是的,你说得对。那是Python2。我编辑了我的答案。
    【解决方案3】:

    您遇到的问题是 python 是强类型但也是动态类型。 8e10000000 实际上是 python(和 C)类型 float 并且是双精度浮点二进制表示的有效值,而 python int 的最大有效值是 9,223,372,036,854,775,807(使用 sys.maxint 找到)。

    因此,python 有一个 decimal 库,它有一个类 decimal.Decimal documentation here 可以执行任意精度数字。它不会像内存或速度那样高效,但它绕过了浮点数所具有的大小限制和精度问题,尤其是在处理金钱时。

    如果您真正使用 inter 值,您可以考虑的另一个选项是使用 long(n) 在 python 2.5+ 中将变量转换为任意大的整数(在 python 3.0+ 中 intlong)这是讨论它的PEP 237 的链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      相关资源
      最近更新 更多