Сделать самое большое число в питоне

Я ищу объект 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') таким образом? Есть ли менее уродливый способ создания этого «наибольшего целого числа»?


person wim    schedule 29.12.2013    source источник
comment
Я думаю, что целые числа в Python совершенно не ограничены.   -  person Mark Ransom    schedule 29.12.2013
comment
stackoverflow.com/questions/3477283/maximum-float-in-python может быть вам полезен   -  person Leifingson    schedule 29.12.2013


Ответы (3)


float('inf') гарантированно будет проверяться как большее, чем любое число, включая целые числа. Это не зависит от платформы.

Из floatobject.c исходного кода:

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 будет обрабатывать особенности базовой платформы, чтобы вы могли это сделать.

person Martijn Pieters    schedule 29.12.2013
comment
Верно ли это и для Python 3? - person Mark Ransom; 29.12.2013
comment
@MartijnPieters Теперь, когда мы подошли к теме, есть ли что-то прямо противоположное этому? Я имею в виду число, которое меньше любого числа в Python? - person thefourtheye; 29.12.2013
comment
@thefourtheye: float('-inf'), минус бесконечность. - person Martijn Pieters; 29.12.2013
comment
@MartijnPieters Спасибо :) - person thefourtheye; 29.12.2013

Почему бы просто не использовать:

x = float('inf')

вместо:

x = 1e3000

Прочтите этот пост для получения дополнительной информации. .

person Christian    schedule 29.12.2013
comment
Ну, мой вопрос по-прежнему означает float('inf') - person wim; 29.12.2013
comment
Я удалил отвлекающую часть о 1e3000, потому что это не имело решающего значения для моего вопроса. - person wim; 29.12.2013

Далее я удаляю необходимость в этом первом дозорном значении x, используя внешний цикл while для захвата первого действительного x, а затем применяя его в сохраненном внутреннем цикле while:

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
person Paddy3118    schedule 29.12.2013
comment
Может быть, @wim, но у дозорных тоже есть свои недоброжелатели. Подумайте о том, насколько вы были неуверенны, что привело к тому, что вам пришлось задать этот вопрос, и людям пришлось проверять исходный код Python, чтобы убедиться, что сравнение между любым int и float('inf') будет работать так, как вы этого хотите. Я думаю, вы могли бы использовать любой метод и комментарий со ссылкой на этот вопрос SO :-) - person Paddy3118; 29.12.2013
comment
p.s. Отсутствие необходимости в сторожевом коде делает его удобным для утиного ввода. Если бы вы определили свой собственный тип, не сравнимый с числами с плавающей запятой, но возвращаемый my_cond и my_calc, тогда все осталось бы в порядке. - person Paddy3118; 29.12.2013