【问题标题】:Maximum value for long integer长整数的最大值
【发布时间】:2012-04-09 06:36:47
【问题描述】:

如何将长整数的最大值分配给变量,例如,类似于 C++ 的LONG_MAX

【问题讨论】:

  • 我不确定 Python 整数是否受到限制。在你越过 sys.maxint 的那一刻,它会将内部表示从 int 更改为 long,它具有无限的精度。
  • 我问是因为我需要在一组值中一个一个地找到一个最小值所以首先我需要将一个大值存储到一个变量中,以便我可以将它与其他值进行比较
  • 对您的评论 - 我建议使用内置函数 min.
  • 如果您只是想找到最小值,则不需要最大值,即使您使用 C++ 或任何其他语言进行编程也是如此。如果您只是要遍历所有元素,只需使用第一个元素作为您的起始值。 (但如果你真的想用 Python 编程,最好使用min 函数!)
  • @Sreevisakh:对于“大价值”,使用无穷大,float("inf")。或者更好的是,使用内置的min 函数。

标签: python


【解决方案1】:

长整数:

没有明确定义的限制。可用地址空间的数量构成了实际限制。
(取自this 网站)。请参阅Numeric Types 上的文档,您将在其中看到Long integers have unlimited precision。在 Python 2 中,整数超出限制时会自动切换为长整数:

>>> import sys
>>> type(sys.maxsize)
<type 'int'>
>>> type(sys.maxsize+1)
<type 'long'>


对于我们有的整数

maxint 和 maxsize:

可以在 Python 2.x 中使用sys.maxint 找到 int 的最大值。它在 Python 3 中被删除,但通常可以使用 sys.maxsize 代替。来自the changelog

删除了 sys.maxint 常量,因为不再有限制 为整数的值。但是, sys.maxsize 可以用作 大于任何实际列表或字符串索引的整数。它符合 实现的“自然”整数大小,通常是相同的 与同一平台上先前版本中的 sys.maxint 一样(假设 相同的构建选项)。

对于任何对the difference (Python 2.x) 感兴趣的人:

sys.maxint Python 正则支持的最大正整数 整数类型。这至少是 2**31-1。最大负整数 是 -maxint-1 — 不对称是由于使用了 2 的补码 二进制算术。

sys.maxsize 平台支持的最大正整数 Py_ssize_t 类型,因此最大大小列表、字符串、字典和 许多其他容器可以有。

为了完整起见,这里是Python 3 version

sys.maxsize 一个整数,给出 Py_ssize_t 类型的变量可以采用的最大值。在 32 位平台上通常为 2^31 - 1,并且 2^63 - 1 在 64 位平台上。

浮动:

float("inf")float("-inf")。这些可以与其他数字类型进行比较:

>>> import sys
>>> float("inf") > sys.maxsize
True

【讨论】:

  • 我尝试了相同的代码,但它仍然在 Windows 64 位机器上的 python 3 中显示类型为 int。任何有价值的理由。
  • @ManojP 这是因为 Python 3 中的整数大小不再有限制。请参阅第一个块引用。我将进行编辑以澄清该示例是 Python 2
【解决方案2】:

Python long 可以任意大。如果您需要一个大于任何其他值的值,您可以使用float('inf'),因为 Python 可以轻松比较不同类型的数值。同样,对于小于任何其他值的值,您可以使用float('-inf')

【讨论】:

  • 所以它返回一个非常大的值吗?
  • 它返回浮点无穷大,它大于任何有限数。
  • 我不得不说,就回答OP的标题问题而言,这个答案绝对是最接近正确的。也就是说,“如何获得一个大于所有输入(或至少不小于最大值)的 Python 哨兵值?”。所以我赞成这个答案,但我认为如果 OP 学会用 Python 思考会更好。
  • 同意。也就是说,我一直处于这样一种情况,这是做我需要做的唯一方法。
【解决方案3】:

直接回答标题问题:

整数的大小没有限制,在 Python 中没有最大值。

回答哪些解决了所述的基础用例:

根据您对您正在尝试做的事情的评论,您目前正在考虑类似于

minval = MAXINT;
for (i = 1; i < num_elems; i++)
    if a[i] < a[i-1]
        minval = a[i];

这不是 Python 的思维方式。更好的 Python 翻译(但仍然不是最好的)是

minval = a[0]  # Just use the first value
for i in range(1, len(a)):
    minval = min(a[i], a[i - 1])

请注意,以上内容根本不使用 MAXINT。该解决方案的这一部分适用于任何编程语言:您无需知道可能的最高值就可以找到集合中的最小值。

但无论如何,你真正在 Python 中所做的只是

minval = min(a)

也就是说,您根本不编写循环。内置的min() 函数获取整个集合的最小值。

【讨论】:

    【解决方案4】:

    long 在 Python 2.x 中使用 arbitrary precision arithmetic 并且没有最大可能值之类的东西。它受可用内存的限制。 Python 3.x 对不能用本机机器整数表示的值没有特殊类型——一切都是int,并且在后台处理转换。

    【讨论】:

      【解决方案5】:

      与 C/C++ 不同,Python 中的 Long 具有无限精度。有关更多信息,请参阅 python 中的 Numeric Types 部分。要确定整数的最大值,您可以参考 sys.maxint。您可以从sys的文档中获取更多详细信息。

      【讨论】:

        【解决方案6】:

        你可以使用:float的最大值是

        float('inf')
        

        否定

        float('-inf')
        

        【讨论】:

        • 标题是“长整数的最大值”,不是float的最大值。所以,没有解释这如何回答这个问题,我认为这个NAA(不是答案)。
        【解决方案7】:

        在 python3 中,您可以将浮点值发送到 int 函数中,以整数表示形式获取该数字 1.7976931348623157e+308。

        import sys    
        int(sys.float_info.max)
        

        【讨论】:

        • 这根本没有任何用处。为了说明这一点,试试 int(sys.float_info.max)+1,你会得到一个多一个整数,因为正如其他 cmets 解释的那样,Python 只存储无限精度整数。
        【解决方案8】:

        A) 对于廉价的比较/算术虚拟,请使用math.inf。或math.nan,它在除身份检查(is)之外的任何方向(包括nan == nan)上比较FALSE,并呈现任何算术(如nan - nannan。或根据您的用例(例如sys.maxsize)的合理高实整数。对于位掩码虚拟对象(例如在 mybits &amp; bitmask 中),请使用 -1

        B) 获取平台原语最大有符号 long int(或 long long):

        >>> 256 ** sys.int_info.sizeof_digit // 2 - 1  # Python’s internal primitive
        2147483647
        >>> 256 ** ctypes.sizeof(ctypes.c_long) // 2 - 1  # CPython
        2147483647
        >>> 256 ** ctypes.sizeof(ctypes.c_longlong) // 2 - 1  # CPython
        9223372036854775807
        >>> 2**63 - 1  # Java / JPython primitive long
        9223372036854775807
        

        C) 最大的 Python 整数可以通过长时间运行的循环戏弄内存溢出来估计(尝试256**int(8e9) - 可以通过KeyboardInterrupt 停止)。但是不能不合理使用,因为它的表示已经消耗了所有的内存,而且比sys.float_info.max大很多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-27
          • 1970-01-01
          • 2011-05-25
          • 1970-01-01
          • 2012-11-20
          • 2012-08-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多