Oneindig geheel getal in Python

Python 3 heeft float('inf')en Decimal('Infinity')maar geen int('inf'). Dus waarom ontbreekt een getal dat de oneindige reeks gehele getallen vertegenwoordigt in de taal? Is int('inf')onredelijk?


Antwoord 1, autoriteit 100%

Genomen vanaf hier: https://www.gnu.org/software /libc/manual/html_node/Infinity-and-NaN.html

IEEE 754 drijvende-kommagetallen kunnen positieve of negatieve oneindigheid vertegenwoordigen, en NaN (geen getal)

Dat wil zeggen, de weergave van floaten Decimalkan deze speciale waarden opslaan. Er is echter niets binnen het basistype intdat hetzelfde kan opslaan. Als je de limiet van 2^32 in een niet-ondertekende 32-bits int overschrijdt, ga je gewoon weer naar 0.

Als je wilt, kun je een klasse maken die een geheel getal bevat dat de mogelijkheid van oneindige waarden kan bevatten.


Antwoord 2, autoriteit 92%

Je hebt gelijk dat een geheel getal oneindig mogelijk is en dat er geen is toegevoegd aan de Python-standaard. Dit komt waarschijnlijk omdat math.infhet in bijna alle gevallen vervangt (zoals Martijn in zijn commentaar aangaf).

In de tussentijd heb ik een implementatie van extended integerstoegevoegd aan 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

Antwoord 3, autoriteit 38%

Voor python 2.
Soms heb je een heel groot geheel getal nodig. Ik wil bijvoorbeeld misschien een subarray produceren met x[:n] en soms wil ik n op een waarde instellen zodat de hele array wordt geproduceerd. Aangezien je geen float voor n kunt gebruiken (python wil een geheel getal), heb je een “groot geheel getal” nodig. Een goede manier om dit te doen is door het grootste beschikbare gehele getal te gebruiken: sys.maxint.
Hier is een voorbeeld:

# MAX_SOURCES = sys.maxint # normal setting
MAX_SOURCES = 5 # while testing
# code to use an array ...
... sources[:MAX_SOURCES]

Dus tijdens het testen zou ik een kleinere array van bronnen kunnen gebruiken, maar de volledige array in productie.

Other episodes