Valores máximos y mínimos para ints

746

Estoy buscando valores mínimos y máximos para enteros en python. Por ejemplo, en Java, tenemos Integer.MIN_VALUEy Integer.MAX_VALUE. ¿Hay algo como esto en Python?

bdhar
fuente
14
Tenga en cuenta que en Python 3 el inttipo es básicamente el mismo que el longde Python 2, por lo que la idea de un máximo o un mínimo intdesaparece por completo. Básicamente es irrelevante incluso en Python 2.
agf
8
@agf: puede ser relevante de varias maneras. Por ejemplo, en cualquier algoritmo que requiera guardar el valor mínimo encontrado (como un algoritmo de clasificación). El valor mínimo se puede inicializar en sys.maxint, por lo que garantiza que cualquier primer valor encontrado se tome como mínimo
Basile Perrenoud
@Toaster excepto que puede tener una lista donde todos los valores son mayores que sys.maxintya que es solo el máximo para el inttipo en Python 2, que Python promocionará silenciosamente a a long.
agf
30
Si necesita utilizar "un valor muy grande" en un algoritmo, por ejemplo, encontrar el mínimo o el máximo de una colección genérica, float('inf')o float('-inf')puede ser bastante útil.
Geoff
1
Posible duplicado de los rangos enteros
Waldir Leoncio

Respuestas:

854

Python 3

En Python 3, esta pregunta no se aplica. El inttipo plano no tiene límites.

Sin embargo, es posible que esté buscando información sobre el tamaño de palabra del intérprete actual , que en la mayoría de los casos será el mismo que el tamaño de palabra de la máquina. Esa información todavía está disponible en Python 3 como sys.maxsize, que es el valor máximo representable por una palabra firmada. Equivalentemente, es el tamaño de la lista más grande posible o secuencia en memoria .

Generalmente, el valor máximo representable por una palabra sin signo será sys.maxsize * 2 + 1, y será el número de bits en una palabra math.log2(sys.maxsize * 2 + 2). Vea esta respuesta para más información.

Python 2

En Python 2, el valor máximo para intvalores simples está disponible como sys.maxint:

>>> sys.maxint
9223372036854775807

Puede calcular el valor mínimo -sys.maxint - 1como se muestra aquí .

Python cambia sin problemas de enteros simples a enteros una vez que excede este valor. Entonces, la mayoría de las veces, no necesitará saberlo.

senderle
fuente
177
Este número puede parecer arbitrario, pero no lo es. 9223372036854775807 es exactamente 2^63 - 1, así que tienes un int de 64 bits. En general, un entero de n bits tiene valores que van desde -2^(n-1)hasta 2^(n-1) - 1.
NullUserException
22
Tenga en cuenta que si está utilizando un tiempo de ejecución de Python de 32 bits, sys.maxint regresará 2^31 - 1, a pesar de que Python saltará a 64 bits sin problemas con el longtipo de datos.
Scott Stafford
19
Utilice en su sys.maxsizelugar, como lo sugiere @Akash Rana. También está presente en Python 2, comosys dicen los documentos . Esto hará que el código sea más compatible con ambas versiones de Python.
Ioannis Filippidis
66
Usted y yo tenemos interpretaciones diferentes de esa línea de los documentos. El reemplazo 2to3es una buena heurística rápida y sucia que no romperá nada la mayor parte del tiempo, pero la diferencia entre estos dos valores es importante. La mejor práctica es usar el valor que realmente quiere usar. Si realmente necesita sys.maxint en Python 2, ya no lo necesitará en Python 3, y realmente debería eliminarse por completo, no cambiarlo sys.maxsize.
senderle
3
minsize - Multiplicar con el operador min Bitwise da minsize ~ sys.maxsize
om471987
239

Si solo necesita un número más grande que todos los demás, puede usar

float('inf')

de manera similar, un número más pequeño que todos los demás:

float('-inf')

Esto funciona tanto en python 2 como en 3.

Melle
fuente
99
Solo una nota aunque (por irrelevante que sea, pero aún así): float ('inf')> float ('inf') da como resultado 'false'. El número infinito debería ser más grande que otro número infinito :-D ...
instantáneas de la
11
@Scre ¿Qué más esperarías? x > xes generalmente False, y el infinito no debería ser la excepción. ( float('NaN), por otro lado ...)
jamesdlin
66
En realidad, esto no se aplica a intcauze cannot convert infinite float to int... pero funciona para la mayoría de los casos
Leighton
55
Tenga en cuenta que int('inf')no funciona.
Tom Hale
44
Esta no es una respuesta a la pregunta del OP
ghosh
225

La sys.maxintconstante se ha eliminado de Python 3.0 en adelante, en lugar de usar sys.maxsize.

Enteros

  • PEP 237: Básicamente, durante mucho tiempo renombrado a int. Es decir, solo hay un tipo integral incorporado, llamado int; pero se comporta principalmente como el viejo tipo largo.
  • PEP 238: Una expresión como 1/2 devuelve un flotador. Use 1 // 2 para obtener el comportamiento de truncamiento. (La última sintaxis ha existido durante años, al menos desde Python 2.2.)
  • Se eliminó la constante sys.maxint, ya que ya no hay un límite para el valor de los enteros. Sin embargo, sys.maxsize se puede usar como un entero más grande que cualquier lista práctica o índice de cadena. Se ajusta al tamaño entero "natural" de la implementación y suele ser el mismo que sys.maxint en versiones anteriores en la misma plataforma (suponiendo las mismas opciones de compilación).
  • El repr () de un entero largo ya no incluye la L final, por lo que el código que elimina ese carácter incondicionalmente cortará el último dígito. (Use str () en su lugar).
  • Los literales octales ya no tienen la forma 0720; use 0o720 en su lugar.

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

Akash Rana
fuente
1
Correcto. De hecho, de help(sys): maxsize: la mayor longitud de contenedores admitidos . Esta debería ser la respuesta aceptada.
Marco Sulla
77

En Python, los enteros cambiarán automáticamente de una intrepresentación de tamaño fijo a una longrepresentación de ancho variable una vez que pase el valor sys.maxint, que es 2 31 - 1 o 2 63 - 1 dependiendo de su plataforma. Observe lo Lque se agrega aquí:

>>> 9223372036854775807
9223372036854775807
>>> 9223372036854775808
9223372036854775808L

Del manual de Python :

Los números se crean mediante literales numéricos o como resultado de funciones y operadores integrados. Los literales enteros sin adornos (incluidos los números binarios, hexadecimales y octales) producen enteros simples a menos que el valor que denotan sea demasiado grande para representarse como un entero simple, en cuyo caso producen un entero largo. Los literales enteros con un 'L'o 'l'sufijo producen enteros largos ( 'L'se prefiere porque se 1lparece demasiado a once).

Python se esfuerza mucho en fingir que sus enteros son enteros matemáticos y no tienen límites. Puede, por ejemplo, calcular un googol con facilidad:

>>> 10**100
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L
John Kugelman
fuente
37
Para agregar a la confusión, Python longno es como el de Java, longestá más cerca BigInteger.
NullUserException
En python3, parece que no hay Lsufijo, y es justo int, no long, no importa cuán grande sea el número.
Eric Wang
39

Para Python 3, es

import sys
max = sys.maxsize
min = -sys.maxsize - 1
netskink
fuente
3
Python 3 no existe. ver stackoverflow.com/questions/13795758/…
netskink
34
bueno, python 3 existe , afortunadamente (!); pero sys.maxintno existe en python 3 (tl; dr: "la sys.maxintconstante se eliminó (en python3), ya que ya no hay un límite para el valor de los enteros. Sin embargo, sys.maxsizese puede usar como un entero más grande que cualquier lista o cadena práctica index. " )
michael
3
¿Por qué crear variables que sombreen las construcciones como min()y max()?
RoadRunner - MSFT
1
Busque el binario de cumplido de 2
netskink
2
min = ~sys.maxsize
Andrew
10

Puede usar 'inf' de esta manera:

import math
bool_true = 0 < math.inf
bool_false = 0 < -math.inf

Consulte: matemáticas - Funciones matemáticas

Rahul Nimbal
fuente
1
Tenga en cuenta que math.infes equivalente afloat('inf')
Georgy
5

Si desea el máximo para los índices de matriz o lista (equivalente a size_ten C / C ++), puede usar numpy:

np.iinfo(np.intp).max

Esto es lo mismo que sys.maxsize pero la ventaja es que no necesita importar sys solo para esto.

Si desea max para Native Int en la máquina:

np.iinfo(np.intc).max

Puedes ver otros tipos disponibles en doc .

Para carrozas también puedes usar sys.float_info.max.

Shital Shah
fuente