1198 votes

Valeurs maximales et minimales pour les entiers

Comment représenter les valeurs minimales et maximales pour les entiers en Python ? En Java, nous avons Integer.MIN_VALUE et Integer.MAX_VALUE.


Voir aussi : <a href="https://stackoverflow.com/questions/3477283">Quel est le flottant maximum en Python ?</a>.

21 votes

Notez que en Python 3, le type int est essentiellement le même que le type long en Python 2, donc l'idée d'un maximum ou d'un minimum int disparaît complètement. C'est fondamentalement sans importance même sur Python 2.

23 votes

@agf : cela peut être pertinent de différentes manières. Par exemple dans n'importe quel algorithme qui nécessite de sauvegarder la valeur minimale trouvée (comme un algorithme de tri). La valeur minimale pourrait être initialisée à sys.maxint, ce qui garantit que n'importe quelle première valeur trouvée est prise comme minimum

2 votes

@Toaster sauf que vous pouvez avoir une liste où toutes les valeurs sont supérieures à sys.maxint car c'est seulement le maximum pour le type int sur Python 2, que Python promouvra silencieusement en long.

30voto

Rahul Nimbal Points 409

Vous pouvez utiliser 'inf' comme ceci :

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

Référence : math — Fonctions mathématiques

10voto

ShitalShah Points 2213

Si vous voulez obtenir le maximum pour les indices d'un tableau ou d'une liste (équivalent à size_t en C/C++), vous pouvez utiliser numpy:

np.iinfo(np.intp).max

C'est la même chose que sys.maxsize mais l'avantage est que vous n'avez pas besoin d'importer sys juste pour cela.

Si vous voulez le max pour un entier natif sur la machine:

np.iinfo(np.intc).max

Vous pouvez consulter les autres types disponibles dans la documentation.

Pour les nombres flottants, vous pouvez également utiliser sys.float_info.max.

6voto

Ismael Harun Points 73

sys.maxsize n'est pas en fait la valeur entière maximale prise en charge. Vous pouvez doubler maxsize et le multiplier par lui-même et il reste une valeur valide et correcte.

Cependant, si vous essayez sys.maxsize ** sys.maxsize, cela bloquera votre machine pendant un certain temps. Comme beaucoup l'ont souligné, la taille en octets et en bits ne semble pas être pertinente car elle n'existe pratiquement pas. Je suppose que Python étend simplement joyeusement ses entiers lorsqu'il a besoin de plus d'espace mémoire. En général, il n'y a pas de limite.

Maintenant, si vous parlez d'emballer ou de stocker des entiers de manière sûre où ils peuvent être récupérés ultérieurement avec intégrité, alors bien sûr c'est pertinent. Je ne suis vraiment pas sûr de l'emballage, mais je sais que le module pickle de Python gère bien ces choses. Les représentations sous forme de chaînes n'ont évidemment aucune limite pratique.

Donc, en réalité, le fond du problème est le suivant : quelle est la limite de vos applications ? De quoi avez-vous besoin en termes de données numériques ? Utilisez cette limite plutôt que la limite d'entiers assez inexistante de Python.

5voto

Boris Points 1440

Sur CPython 3.11 sur un système 64 bits, les entiers maximum et minimum sont

  2 ** ((2 ** 63 - 1) * 30) - 1
-(2 ** ( 2 ** 63      * 30) - 1)

Il vous faudra 40 exaoctets de mémoire pour en créer un, ce qui coûterait $70 milliards aux prix actuels (juillet 2023) de $57 par tranche de 32 Go sur NewEgg, donc en pratique l'entier maximum de Python est limité par la quantité de mémoire disponible sur votre ordinateur.


CPython 3.11 stocke les entiers comme ceci (j'ai simplifié le code réel en enlevant tous les macros):

struct PyLongObject {
    Py_ssize_t ob_refcnt;  /* Métadonnées pour la collecte des déchets */
    PyTypeObject* ob_type; /* Métadonnées pour type() */
    Py_ssize_t ob_size;    /* Nombre d'éléments dans ob_digit */
    uint32_t ob_digit[1];  /* Tableau de 32 bits entiers */
};

Ainsi, sur un système 64 bits, les entiers Python sont implémentés comme un tableau de 32 bits entiers stockant la valeur absolue de l'entier (mais 2 des bits de chaque entier ne sont pas utilisés) et un entier signé complément à deux de 64 bits stocke la longueur de ce tableau ainsi que le signe de l'entier Python, donc un entier négatif a une "taille" négative.

4voto

Wender Points 483

Je compte beaucoup sur des commandes comme celle-ci.

python -c 'import sys; print(sys.maxsize)'

Intervalle max retourné : 9223372036854775807

Pour plus de références sur 'sys', vous devriez accéder à

https://docs.python.org/3/library/sys.html

https://docs.python.org/3/library/sys.html#sys.maxsize

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X