Valores máximos e mínimos para ints


745

Eu estou procurando valores mínimos e máximos para números inteiros em python. Por exemplo, em Java, temos Integer.MIN_VALUEe Integer.MAX_VALUE. Existe algo parecido com isto em python?


14
Observe que no Python 3 o inttipo é basicamente o mesmo que longno Python 2; portanto, a ideia de um máximo ou mínimo intdesaparece completamente. É basicamente irrelevante, mesmo no Python 2. #
agf

8
@ AGF: pode ser relevante de várias maneiras. Por exemplo, em qualquer algoritmo que exija salvar o valor mínimo encontrado (como um algoritmo de classificação). O valor mínimo pode ser inicializado em sys.maxint para garantir que qualquer primeiro valor encontrado seja considerado min
Basile Perrenoud

@ Toaster, exceto que você pode ter uma lista em que todos os valores são maiores do que, sys.maxintuma vez que é apenas o máximo para o inttipo no Python 2, que o Python promoverá silenciosamente para a long.
agf

30
Se você precisar usar "um valor muito grande" em um algoritmo, por exemplo, encontrar o mínimo ou o máximo de uma coleção genérica, float('inf')ou float('-inf')pode ser bastante útil.
geoff

Respostas:


853

Python 3

No Python 3, essa pergunta não se aplica. O inttipo simples é ilimitado.

No entanto, você pode realmente estar procurando informações sobre o tamanho atual da palavra do intérprete , que será o mesmo que o tamanho da palavra da máquina na maioria dos casos. Essa informação ainda está disponível no Python 3 como sys.maxsize, que é o valor máximo representável por uma palavra assinada. Equivalentemente, é o tamanho da maior lista possível ou sequência na memória .

Geralmente, o valor máximo representável por uma palavra não assinada será sys.maxsize * 2 + 1e o número de bits em uma palavra será math.log2(sys.maxsize * 2 + 2). Veja esta resposta para mais informações.

Python 2

No Python 2, o valor máximo para intvalores simples está disponível como sys.maxint:

>>> sys.maxint
9223372036854775807

Você pode calcular o valor mínimo com, -sys.maxint - 1como mostrado aqui .

O Python alterna perfeitamente de inteiros simples para longos depois que você excede esse valor. Então, na maioria das vezes, você não precisará saber disso.


177
Esse número pode parecer arbitrário, mas não é. 9223372036854775807 é exatamente 2^63 - 1, então você tem um int de 64 bits. Em geral, um número inteiro de n bits possui valores que variam de -2^(n-1)a 2^(n-1) - 1.
NullUserException 30/09

22
Observe que, se você estiver usando um tempo de execução Python de 32 bits, o sys.maxint retornará 2^31 - 1, mesmo que o Python vá para 64 bits perfeitamente com o longtipo de dados.
Scott Stafford

19
Use sys.maxsizecomo sugerido por @Akash Rana. Também está presente no Python 2, comosys dizem os documentos . Isso tornará o código mais compatível com as duas versões do Python.
Ioannis Filippidis 27/10/2015

6
Você e eu temos diferentes interpretações dessa linha dos documentos. A substituição 2to3é uma heurística rápida e suja que não quebra nada na maioria das vezes - mas a diferença entre esses dois valores é importante. A melhor prática é usar o valor que você realmente deseja usar. Se você realmente precisa sys.maxint no Python 2, não precisará mais dele no Python 3, e ele realmente deve ser completamente removido, não alterado para sys.maxsize.
Senderle

3
minsize - A multiplicação pelo operador min bit a bit fornece minsize ~ sys.maxsize
om471987 14/16

238

Se você só precisa de um número maior que todos os outros, pode usar

float('inf')

de maneira semelhante, um número menor que todos os outros:

float('-inf')

Isso funciona nos python 2 e 3.


9
Apenas uma nota que (por mais irrelevante que seja, mas ainda assim): float ('inf')> float ('inf') resulta em 'false'. Infinito número deve ser maior do que outro número infinito :-D ... mente snaps
Scre

11
@ Scre O que mais você esperaria? x > xé geralmente False, e o infinito não deve ser exceção. ( float('NaN), por outro lado ...)
jamesdlin 6/17

6
Isso realmente não se aplica para intCauze cannot convert infinite float to int... mas funciona para a maioria dos casos
Leighton

5
Observe que int('inf')não funciona.
Tom Hale

4
Esta não é uma resposta para a pergunta OP
ghosh

225

A sys.maxintconstante foi removida do Python 3.0 em diante, em vez disso, use sys.maxsize.

Inteiros

  • PEP 237: Essencialmente, renomeado por muito tempo para int. Ou seja, existe apenas um tipo integral interno, chamado int; mas se comporta principalmente como o velho tipo longo.
  • PEP 238: Uma expressão como 1/2 retorna um float. Use 1 // 2 para obter o comportamento de truncamento. (A última sintaxe existe há anos, pelo menos desde o Python 2.2.)
  • A constante sys.maxint foi removida, pois não há mais um limite para o valor de números inteiros. No entanto, sys.maxsize pode ser usado como um número inteiro maior que qualquer lista prática ou índice de cadeias. Ele está de acordo com o tamanho inteiro "natural" da implementação e normalmente é o mesmo que sys.maxint em releases anteriores na mesma plataforma (assumindo as mesmas opções de compilação).
  • O repr () de um número inteiro longo não inclui mais o L à direita, portanto, o código que retira incondicionalmente esse caractere cortará o último dígito. (Use str () em vez disso.)
  • Literais octais não são mais do formato 0720; use 0o720.

Consulte: https://docs.python.org/3/whatsnew/3.0.html#integers


1
Corrigir. De fato, from help(sys): maxsize - o maior comprimento suportado de contêineres . Essa deve ser a resposta aceita.
Marco Sulla

77

No Python, os números inteiros alternam automaticamente de uma intrepresentação de tamanho fixo para uma longrepresentação de largura variável assim que você passar o valor sys.maxint, que é 2 31 - 1 ou 2 63 - 1, dependendo da sua plataforma. Observe o Lque é anexado aqui:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

No manual do Python :

Os números são criados por literais numéricos ou como resultado de funções e operadores internos. Literais inteiros sem adornos (incluindo números binários, hexadecimais e octais) produzem números inteiros simples, a menos que o valor que eles denotem seja muito grande para ser representado como um número inteiro simples; nesse caso, eles produzem um número inteiro longo. Literais inteiros com um sufixo 'L'ou 'l'produzem inteiros longos ( 'L'é preferível porque se 1lparece muito com onze!).

O Python tenta muito fingir que seus números inteiros são números matemáticos e sem limites. Pode, por exemplo, calcular um googol com facilidade:

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

36
Para aumentar a confusão, o Python longnão é como o Java long- é um pouco mais próximo BigInteger.
NullUserException 30/09

Em python3, parece que não há Lsufixo, e é apenas int, não long, não importa o tamanho do número.
Eric Wang

39

Para Python 3, é

import sys
max = sys.maxsize
min = -sys.maxsize - 1


34
bem, python 3 existe , felizmente (!); mas sys.maxintnão existe no python 3 (tl; dr: " sys.maxintconstante foi removida (no python3), pois não há mais um limite para o valor de números inteiros. No entanto, sys.maxsizepode ser usado como um número inteiro maior que qualquer lista ou string prática index. " )
michael

2
Por que criar variáveis ​​que sombreiam os componentes internos como min()e max()?
RoadRunner - MSFT

1
Procure o binário do elogio do 2
netskink 6/06/19

2
min = ~sys.maxsize
Andrew


5

Se você deseja o máximo para os índices de matriz ou lista (equivalente a size_tC / C ++), pode usar numpy:

np.iinfo(np.intp).max

Isso é o mesmo que, sys.maxsizeno entanto, a vantagem é que você não precisa de sistemas de importação apenas para isso.

Se você deseja max para int nativo na máquina:

np.iinfo(np.intc).max

Você pode ver outros tipos disponíveis no doc .

Para carros alegóricos, você também pode usar sys.float_info.max.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.