在python中创造最大的数字

时间:2013-12-29 03:36:11

标签: python integer comparison-operators

我正在寻找一个Python对象,保证比任何给定的int都要大。它应该是可移植的,独立于平台的,并且可以在Python 2.7+和3.x上运行。

例如:

x = float('inf')
while True:
    n = next(my_gen)
    if my_calc(n):
        x = min(n, x)
        if my_cond(x):
            break

我在这里使用了float('inf'),因为它似乎行为正确。但这感觉很脏,因为我认为它依赖于一些潜在的浮动规范,我不知道这是依赖于平台还是以意想不到的方式中断。

我知道我可以创建自己的类并定义比较运算符,但我认为可能存在内置方式。

这样使用float('inf')是否安全?是否有一种不那么丑陋的方式来创造这个“最大整数”?

3 个答案:

答案 0 :(得分:9)

保证

float('inf')的测试大于任何数字,包括整数。这不是特定于平台的。

来自floatobject.c source code

else if (!Py_IS_FINITE(i)) {
    if (PyInt_Check(w) || PyLong_Check(w))
        /* If i is an infinity, its magnitude exceeds any
         * finite integer, so it doesn't matter which int we
         * compare i with.  If i is a NaN, similarly.
         */
        j = 0.0;

Python整数本身只受内存限制,因此使用10 ** 3000可能不够大。

float('inf') 始终可用; Python将为您处理底层平台细节。

答案 1 :(得分:1)

为什么不直接使用:

x = float('inf')

而不是:

x = 1e3000

阅读此post以获取更多信息。

答案 2 :(得分:0)

在下面我通过使用外部while循环捕获第一个有效x然后在保留的内部使用它来删除对第一个sentinel x值的需要while loop:

while True:
    n = next(my_gen)
    if my_calc(n):
        x = n
        if my_cond(x):
            break
        else:
            while True:
                n = next(my_gen)
                if my_calc(n):
                    x = min(n, x)
                    if my_cond(x):
                        break  
            break

这是更多的代码。通常删除哨兵值是好的,但必须评估上述可维护性

进一步分解代码给出了以下内容,但上面的代码保留了更多的原始条件。

while True:
    n = next(my_gen)
    if my_calc(n):
        x = n
        if not my_cond(x):
            while True:
                n = next(my_gen)
                if my_calc(n):
                    x = min(n, x)
                    if my_cond(x):
                        break  
        break