Python中的无限整数
Python 3中有 float('inf')
和 Decimal('Infinity')
,但没有 int('inf')
。那么,为什么表示无限整数的数字在这个语言里缺失呢? int('inf')
是不是不合理呢?
3 个回答
5
对于 Python 2,有时候你需要一个非常大的整数。比如说,我可能想用 x[:n] 来生成一个子数组,而有时我希望 n 的值能让整个数组都被生成出来。因为 n 不能是浮点数(Python 需要整数),所以你需要一个“很大的整数”。一个好的方法是使用系统能提供的最大整数:sys.maxint。下面是一个例子:
# MAX_SOURCES = sys.maxint # normal setting
MAX_SOURCES = 5 # while testing
# code to use an array ...
... sources[:MAX_SOURCES]
这样,在测试的时候,我可以使用一个较小的源数组,但在实际使用中则可以用完整的数组。
12
摘自这里:https://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html
IEEE 754 浮点数可以表示正无穷、负无穷和 NaN(不是一个数字)
也就是说,float
和 Decimal
这两种数据类型可以存储这些特殊的值。不过,基本类型 int
就没有办法存储这些值。当你超过一个无符号的 32 位整数的最大值(2^32)时,它会直接回到 0。
如果你想的话,可以创建一个类,里面包含一个整数,这样就可以让这个整数有可能表示无穷大的值。
20
你说得对,整数的无穷大是有可能的,但在Python标准库中并没有添加这个功能。这可能是因为在大多数情况下,math.inf
已经可以替代它(正如Martijn在评论中提到的)。
与此同时,我在PyPI上添加了一个扩展整数的实现:
In [0]: from numbers import Integral, Real
In [0]: from extended_int import int_inf, ExtendedIntegral, Infinite
In [0]: i = int_inf
In [4]: float(i)
Out[4]: inf
In [5]: print(i)
inf
In [6]: i ** i
Out[6]: inf
In [7]: i
Out[7]: inf
In [9]: isinstance(i, Real)
Out[9]: True
In [10]: isinstance(i, Integral)
Out[10]: False
In [11]: isinstance(i, Infinite)
Out[11]: True
In [12]: isinstance(i, ExtendedIntegral)
Out[12]: True
In [13]: isinstance(2, ExtendedIntegral)
Out[13]: True
In [14]: isinstance(2, Infinite)
Out[14]: False