web-dev-qa-db-fra.com

Nombre entier infini dans Python

Python 3 a float('inf') et Decimal('Infinity') mais pas int('inf'). Alors, pourquoi manque-t-il un nombre représentant l'infini des nombres entiers dans le langage? Est-ce que int('inf') est déraisonnable?

51
Carlo Pires

Extrait de ici: https://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html

Les nombres à virgule flottante IEEE 754 peuvent représenter l'infini positif ou négatif, et NaN (pas un nombre)

En d’autres termes, la représentation de float et Decimal peut stocker ces valeurs spéciales. Cependant, rien dans le type de base int ne peut stocker le même. Lorsque vous dépassez la limite de 2 ^ 32 dans un entier 32 bits non signé, vous passez simplement de nouveau à 0.

Si vous le souhaitez, vous pouvez créer une classe contenant un entier pouvant comporter des valeurs infinies.

11
Søren V. Poulsen

Vous avez raison de dire qu’un infini d’entier est possible et qu’aucun n’a été ajouté à la norme Python. Ceci est probablement dû au fait que math.inf le supplante dans presque tous les cas (comme Martijn l’a déclaré dans son commentaire).

En attendant, j'ai ajouté une implémentation de entiers étendus sur PyPI:

In [0]: from numbers import Integral, Real

In [0]: from extended_int import int_inf, ExtendedIntegral, Infinite

In [0]: i = int_inf

In [4]: float(i)
Out[4]: inf

In [5]: print(i)
inf

In [6]: i ** i

Out[6]: inf

In [7]: i
Out[7]: inf

In [9]: isinstance(i, Real)

Out[9]: True

In [10]: isinstance(i, Integral)

Out[10]: False

In [11]: isinstance(i, Infinite)

Out[11]: True

In [12]: isinstance(i, ExtendedIntegral)

Out[12]: True

In [13]: isinstance(2, ExtendedIntegral)

Out[13]: True

In [14]: isinstance(2, Infinite)

Out[14]: False
7
Neil G

For python 2. Il est parfois nécessaire d'avoir un très grand nombre entier. Par exemple, je peux vouloir produire un sous-tableau avec x [: n] et, parfois, je souhaite définir Si vous ne pouvez pas utiliser un float pour n (python veut un entier), vous avez besoin d'un "grand entier". Pour ce faire, utilisez le plus grand entier. available: sys.maxint. Voici un exemple:

# MAX_SOURCES = sys.maxint # normal setting
MAX_SOURCES = 5 # while testing

# code to use an array ...
... sources[:MAX_SOURCES]

Ainsi, lors des tests, je pourrais utiliser un tableau de sources plus petit mais utiliser le tableau complet en production.

2
Jacques Sauvé