整数的最大值和最小值
- 2024-12-09 08:30:00
- admin 原创
- 146
问题描述:
如何在 Python 中表示整数的最小值和最大值?在 Java 中,我们有Integer.MIN_VALUE
和Integer.MAX_VALUE
。
另请参阅:Python 中的最大浮点数是多少?。
解决方案 1:
Python 3
在 Python 3 中,这个问题不再适用。普通int
类型是无界的。
但是,您实际上可能正在寻找有关当前解释器的字长 的信息,在大多数情况下,该信息与机器的字长相同。该信息在 Python 3 中仍然可用sys.maxsize
,即 ,这是有符号字可表示的最大值。等效地,它是最大可能列表或内存序列的大小。
通常,无符号字可表示的最大值为sys.maxsize * 2 + 1
,字中的位数为math.log2(sys.maxsize * 2 + 2)
。有关更多信息,请参阅此答案。
Python 2
在 Python 2 中,普通值的最大值int
如下sys.maxint
:
>>> sys.maxint # on my system, 2**63-1
9223372036854775807
您可以按照文档中-sys.maxint - 1
所示计算最小值。
一旦超过此值,Python 就会无缝地从普通整数切换到长整数。因此大多数时候,您不需要知道它。
解决方案 2:
如果你只需要一个比所有其他数字都大的数字,你可以使用
float('inf')
类似地,一个比所有其他数字都小的数字:
float('-inf')
这在 Python 2 和 Python 3 中都有效。
解决方案 3:
sys.maxint
从 Python 3.0 开始已删除常量,而是使用sys.maxsize
。
整数
PEP 237:本质上,
long
重命名为int
。也就是说,只有一种内置整数类型,名为int
;但它的行为与旧long
类型大致相同。...
删除了常量
sys.maxint
,因为整数值不再有限制。但是,sys.maxsize
可以用作大于任何实际列表或字符串索引的整数。它符合实现的“自然”整数大小,并且通常与sys.maxint
同一平台上的先前版本相同(假设相同的构建选项)。
解决方案 4:
对于 Python 3,该类型没有最大值或最小值int
。
你可能会sys.maxsize
对此感兴趣。根据文档:
系统最大大小
一个整数,给出类型变量可以取的最大值
Py_ssize_t
。它通常2**31 - 1
用于 32 位平台和2**63 - 1
64 位平台。
import sys
max_size = sys.maxsize
min_size = -sys.maxsize - 1
解决方案 5:
在 Python 2 中,一旦您传递值,整数将自动从固定大小int
表示转换为可变宽度表示,该值是 2 31 - 1 或 2 63 - 1,具体取决于您的平台。请注意此处附加的 :long
`sys.maxint`L
>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L
来自Python 2.7 手册:
数字由数字文字或内置函数和运算符创建。未经修饰的整数文字(包括二进制、十六进制和八进制数字)会产生纯整数,除非它们表示的值太大而无法表示为纯整数,在这种情况下它们会产生长整数。带有
'L'
或'l'
后缀的整数文字会产生长整数('L'
这是首选,因为1l
看起来太像十一了!)。
Python 尽力将其整数视为数学整数,且无界。例如,它可以轻松计算googol :
>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L
解决方案 6:
您可以像这样使用“inf”:
import math
bool_true = 0 < math.inf
bool_false = 0 < -math.inf
参考:数学——数学函数
解决方案 7:
如果你想要数组或列表索引的最大值(相当于size_t
C/C++),你可以使用 numpy:
np.iinfo(np.intp).max
然而,这与优点相同sys.maxsize
,您不需要为此导入系统。
如果您希望机器上的本机 int 为最大值:
np.iinfo(np.intc).max
您可以在文档中查看其他可用类型。
对于浮点数,您也可以使用sys.float_info.max
。
解决方案 8:
在 64 位系统上的 CPython 3.11 中,最大和最小整数为
2 ** ((2 ** 63 - 1) * 30) - 1
-(2 ** ( 2 ** 63 * 30) - 1)
您需要40 EB的内存来创建一个,按照今天(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 */
};
因此,在 64 位系统上,Python 整数被实现为一个 32 位整数数组,用于存储整数的绝对值(但每个整数的 2 位未被使用),并且 64 位有符号二进制补码整数存储该数组的长度以及 Python 整数的符号,因此负整数具有负的“大小”。
解决方案 9:
sys.maxsize
并非实际支持的最大整数值。您可以将 maxsize 翻倍,然后乘以自身,它仍然是有效且正确的值。
但是,如果您尝试这样做sys.maxsize ** sys.maxsize
,它将使您的机器挂起相当长的时间。正如许多人指出的那样,字节和位大小似乎并不相关,因为它实际上不存在。我猜 Python 在需要更多内存空间时会愉快地扩展它的整数。所以一般来说没有限制。
现在,如果您谈论的是以一种安全的方式打包或存储整数,以便以后可以完整地检索它们,那么这当然是相关的。我真的不确定打包,但我知道 python 的pickle
模块可以很好地处理这些事情。字符串表示显然没有实际限制。
所以,真正的关键是:你的应用程序限制是什么?它对数字数据有什么要求?使用该限制,而不是 python 几乎不存在的整数限制。
解决方案 10:
我非常依赖这样的命令。
python -c 'import sys; print(sys.maxsize)'
返回的最大整数:9223372036854775807
有关“sys”的更多参考,请访问
https://docs.python.org/3/library/sys.html
https://docs.python.org/3/library/sys.html#sys.maxsize
解决方案 11:
正如其他答案所指出的那样,与float
(其最大值为sys.float_info.max
) 不同,int
Python 中的类型是无界的;它实际上受机器内存限制的限制。也就是说,有一些与整数相关的限制。
例如,自 Python 3.10.7 起,转换str
为int
或打印int
限制为 4300 位数字,其结果是默认情况下将非常长的整数写入文件受到限制(可以通过运行关闭此功能sys.set_int_max_str_digits(0)
)。您可以使用获取有关 Python 中整数内部表示的信息sys.int_info
。
而且由于float
是有界的,您无法执行输出将成为浮点数界限之外的浮点数的计算(例如,2**1025/2
引发OverflowError
)。
此外,int
在流行的数据分析库(如numpy和pandas等)中,它们的类型受到限制,例如numpy.uint64
可以保存numpy中最大的正整数,可以通过检查np.iinfo('uint64')
。这意味着我们不能执行涉及太大整数的矢量化计算,例如我们不能取2**64的log2(事实上,np.log2(2**64)
会引发TypeError)。
sys.maxsize
是最大可能列表的大小。您可以使用 来检查range()
。
len(range(sys.maxsize)) == sys.maxsize # 9223372036854775807
len(range(sys.maxsize+1)) # OverflowError
解决方案 12:
下面给出的代码将对您有所帮助。对于最大值,您可以使用sys.maxsize,对于最小值,您可以取反相同的值并使用它。
import sys
ni=sys.maxsize
print(ni)