整数的最大值和最小值

bdh*_*har 648 python integer

我在python中寻找整数的最小值和最大值.例如,在Java中,我们有Integer.MIN_VALUEInteger.MAX_VALUE.在python中有这样的东西吗?

sen*_*rle 748

Python 3

在Python 3中,这个问题不适用.普通int类型是无限的.

但是,您实际上可能正在寻找机器的字大小.这仍然在Python 3中可用sys.maxsize.

Python 2

在Python 2中,普通int值的最大值可用sys.maxint:

>>> sys.maxint
9223372036854775807
Run Code Online (Sandbox Code Playgroud)

您可以使用此处-sys.maxint - 1所示计算最小值.

一旦超过此值,Python就会从普通整数切换为长整数.所以大多数时候,你不需要知道它.

  • 这个数字似乎是任意的,但事实并非如此.9223372036854775807正是`2 ^ 63 - 1`,所以你有一个64位的int.通常,n位整数具有范围从"-2 ^(n-1)"到"2 ^(n-1)-1"的值. (162认同)
  • 请注意,如果您使用的是32位Python运行时,sys.maxint将返回"2 ^ 31 - 1",即使Python将使用`long`数据类型无缝跳转到64位. (19认同)
  • 使用`sys.maxsize`代替,如@Akash Rana所建议的那样.它也存在于Python 2中,[如`sys` docs](https://docs.python.org/2/library/sys.html#sys.maxsize)所说.这将使代码与两个Python版本更兼容. (15认同)
  • 你和我对文档中的那一行有不同的解释.在'2to3`中的替换是一种精细的快速和肮脏的启发式,它不会在大多数时间内破坏任何东西 - 但这两个值之间的差异很重要.最佳做法是使用您实际意味着使用的值.如果你在Python 2中只需要``sys.maxint`,你将不再需要它在Python 3中,它应该完全被删除,而不是改为`sys.maxsize`. (6认同)
  • minsize - 与Bitwise min运算符相乘得到minsize~sys.maxsize (2认同)
  • 另外 [`sys.int_info`](https://docs.python.org/3.4/library/sys.html#sys.int_info) 可能会感兴趣。 (2认同)
  • @DerekFan,因为像几乎所有现代计算平台一样,Python 使用[二进制补码](https://en.wikipedia.org/wiki/Two%27s_complement)。基本上,您有偶数个可能值,并且零在正值中占据一位置,因此负值比非零正值多一个。 (2认同)

Aka*_*ana 204

sys.maxint常量已从Python 3.0开始删除,而是使用sys.maxsize

整型

  • PEP 237:基本上,长期重命名为int.也就是说,只有一个内置的整数类型,名为int; 但它的行为大多像旧的长型.
  • PEP 238:像1/2这样的表达式返回一个浮点数.使用1 // 2来获取截断行为.(后一种语法已存在多年,至少从Python 2.2开始.)
  • 删除了sys.maxint常量,因为不再对整数值进行限制.但是,sys.maxsize可以用作大于任何实际列表或字符串索引的整数.它符合实现的"自然"整数大小,并且通常与同一平台上以前版本中的sys.maxint相同(假设具有相同的构建选项).
  • 长整数的repr()不再包含尾随L,因此无条件地剥离该字符的代码将切掉最后一位数字.(改用str().)
  • 八进制文字不再是0720的形式; 请改用0o720.

请参阅:https://docs.python.org/3/whatsnew/3.0.html

  • 正确的。事实上,来自“help(sys)”:*maxsize——容器支持的最大长度*。这应该是公认的答案。 (2认同)

Mel*_*lle 195

如果你只需要一个比其他数字更大的数字,你可以使用

float('inf')
Run Code Online (Sandbox Code Playgroud)

以类似的方式,比其他所有人都小:

float('-inf')
Run Code Online (Sandbox Code Playgroud)

这适用于python 2和3.

  • 只是注意事项(与其无关,但仍然如此):float('inf')> float('inf')导致'false'.无限数量应该大于另一个无限数:-D ...*精神快照* (8认同)
  • @Scre你还期待什么?`x> x`通常是'False`,无穷大应该也不例外.(`浮动('NaN)`,另一方面......) (8认同)
  • 这不是OP问题的答案 (7认同)
  • @ghosh 但它对我有用 (5认同)
  • @ghosh也许不是,但它回答了OP可能提出的问题。在Java(和类似的)中,如果您想跟踪最小值(例如),您可以从存储最大int开始,以便其他任何值都小于它。在 Python 中,你可以使用 `float('inf')` 实现相同的行为,它的工作原理是因为对于任何 `int` `a` 来说 `float('inf') > a`,并且因为 `a` 的类型可以随意更改,只需设置 `a = min(a, b)` (5认同)
  • 这实际上不适用于`int` cauze`不能将无限浮点数转换为int` ...但适用于大多数情况 (4认同)
  • @Scre “在比较操作中,正无穷大比除自身和 NaN 以外的所有值都大,负无穷大比除自身和 NaN 以外的所有值都小。” http://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html (3认同)
  • 请注意,`int('inf')`无效。 (3认同)

Joh*_*ica 77

在Python中,一旦传递了值,整数将自动从固定大小的int表示切换为可变宽度long表示sys.maxint,取决于您的平台,该值为2 31 - 1或2 63 - 1.注意L这附加了:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L
Run Code Online (Sandbox Code Playgroud)

Python手册:

数字由数字文字或内置函数和运算符的结果创建.纯文本整数文字(包括二进制,十六进制和八进制数)产生普通整数,除非它们表示的值太大而不能表示为普通整数,在这种情况下它们会产生一个长整数.带有'L''l'后缀的整数文字会产生长整数('L'首选因为1l看起来太像11!).

Python非常努力地假装它的整数是数学整数并且是无界的.例如,它可以轻松地计算一个googol:

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L
Run Code Online (Sandbox Code Playgroud)

  • 更令人困惑的是,Python的"long"与Java的"long"不同 - 它更接近于"BigInteger". (35认同)
  • 在python3中,似乎没有“L”后缀,而且无论数字有多大,它只是“int”,而不是“long”。 (3认同)

net*_*ink 27

对于Python 3,它是

import sys
max = sys.maxsize
min = -sys.maxsize -1
Run Code Online (Sandbox Code Playgroud)

  • 好吧,python 3确实_exist_,谢天谢地(!); 但是`sys.maxint`在python 3中不存在(tl; dr:_"`sys.maxint`常量被删除(在python3中),因为整数值不再有限制.但是,`sys .maxsize`可以用作大于任何实际列表或字符串索引的整数."_) (28认同)
  • 为什么要创建隐藏内置函数的变量,例如 `min()` 和 `max()`? (6认同)
  • 这个答案是错误的。如果这是真的,“sys.maxsize ** 2”将不会返回有效且正确的值,但它确实会返回。你应该删除这个答案。 (4认同)
  • 查找 2 的补码二进制 (3认同)
  • `min = ~sys.maxsize` (3认同)
  • python 3不存在.见http://stackoverflow.com/questions/13795758/what-is-sys-maxint-in-python-3 (2认同)
  • 这些作为算法中的哨兵值非常有用,这是一种常见的用法。请不要删除这个答案,只要明确它是最实用的答案,即使不是数学上最正确的答案。 (2认同)

Rah*_*bal 25

您可以像这样使用“inf”:

import math
bool_true = 0 < math.inf
bool_false = 0 < -math.inf
Run Code Online (Sandbox Code Playgroud)

参考:math - 数学函数

  • 请注意,“math.inf”相当于“float('inf')” (4认同)
  • 作者质疑如何获取 MAX 和 MIN int 值。既然结果是 True 和 False,而不是 MAX 和 MIN,那么这个答案与问题有何关系? (3认同)

Shi*_*hah 6

如果你想要数组或列表索引的最大值(相当于size_t在 C/C++ 中),你可以使用 numpy:

np.iinfo(np.intp).max
Run Code Online (Sandbox Code Playgroud)

这与sys.maxsize但是优点是你不需要 import sys 只是为了这个。

如果您想在机器上使用 max for native int:

np.iinfo(np.intc).max
Run Code Online (Sandbox Code Playgroud)

您可以在doc 中查看其他可用类型。

对于浮点数,您也可以使用sys.float_info.max.


Ism*_*run 6

sys.maxsize不是实际支持的最大整数值。您可以将 maxsize 加倍并乘以它本身,它仍然是一个有效且正确的值。

但是,如果您尝试这样做sys.maxsize ** sys.maxsize,它将使您的计算机挂起相当长的时间。正如许多人指出的那样,字节和位大小似乎并不相关,因为它实际上不存在。我猜想当 python 需要更多内存空间时,它只是高兴地扩展它的整数。所以一般来说没有限制。

现在,如果您正在谈论以安全的方式打包或存储整数,以便稍后可以完整地检索它们,那么这当然是相关的。我真的不确定打包的事情,但我知道 python 的pickle模块可以很好地处理这些事情。字符串表示显然没有实际限制。

所以实际上,底线是:您的应用程序限制是什么?数字数据需要什么?使用该限制而不是 python 相当不存在的整数限制。


小智 5

在 64 位系统上的 CPython 3.11 上,最大和最小整数为

  2 ** ((2 ** 63 - 1) * 30) - 1
-(2 ** ( 2 ** 63      * 30) - 1)
Run Code Online (Sandbox Code Playgroud)

您将需要40 艾字节内存来创建一个,按照今天(2023 年 7 月)NewEgg 上每 32GB 57 美元的价格计算,这将花费700 亿美元,因此实际上 Python 的最大整数受到计算机内存量的限制。


CPython 3.11像这样存储整数(我通过删除所有宏来简化实际代码):

struct PyLongObject {
    Py_ssize_t ob_refcnt;  /* Metadata for garbage collection */
    PyTypeObject* ob_type; /* Metadata for type() */
    Py_ssize_t ob_size;    /* Number of items in ob_digit */
    uint32_t ob_digit[1];  /* Array of 32-bit integers */
};
Run Code Online (Sandbox Code Playgroud)

因此,在 64 位系统上,Python 整数被实现为存储整数绝对值的 32 位整数数组(但不使用每个整数的 2 位)和 64 位有符号二进制补码整数存储该数组的长度以及 Python 整数的符号,因此负整数具有负“大小”。