Wie kann ich in Python eine unendliche Zahl darstellen?

559

Wie kann ich eine unendliche Zahl in Python darstellen? Unabhängig davon, welche Zahl Sie in das Programm eingeben, sollte keine Zahl größer sein als diese Darstellung der Unendlichkeit.

ssierral
quelle
29
math.infist als Anfangswert bei Optimierungsproblemen nützlich, da es mit min korrekt funktioniert, z. min(5, math.inf) == 5. Beispielsweise können Sie bei Algorithmen mit kürzesten Pfaden unbekannte Entfernungen festlegen, math.infohne dass ein Sonderfall erforderlich ist Noneoder eine Obergrenze angenommen wird 9999999. Ebenso können Sie -math.infals Startwert für Maximierungsprobleme verwenden.
Colonel Panic
In den meisten Fällen besteht eine Alternative zur Verwendung von math.inf bei Optimierungsproblemen darin, mit dem ersten Wert zu beginnen.
Tobias Bergkvist

Antworten:

707

In Python können Sie Folgendes tun:

test = float("inf")

In Python 3.5 können Sie Folgendes tun:

import math
test = math.inf

Und dann:

test > 1
test > 10000
test > x

Wird immer wahr sein. Es sei denn natürlich, wie bereits erwähnt, ist x auch unendlich oder "nan" ("keine Zahl").

Zusätzlich (Python 2.x ONLY), im Vergleich zu Ellipsis, float(inf)ist weniger, zum Beispiel:

float('inf') < Ellipsis

würde wahr zurückgeben.

WilHall
quelle
15
Und wenn x auch inf ist, wird das nicht wahr sein.
Maxim Egorushkin
5
Beachten Sie, dass Unendlichkeit in der Norm IEEE 754-1985 ( en.wikipedia.org/wiki/IEEE_754-1985 ) definiert ist, auf die sich jede moderne Sprache stützen wird. Ein weiterer Punkt ist, dass nach dieser Norm die Unendlichkeit (offensichtlich) eine Gleitkommazahl sein muss. Dies könnte erklären, warum Python diese akward-Syntax gewählt hat.
Quickbug
3
Es wird auch nicht wahr sein, wenn x das eingebaute ist Ellipsis, das mehr als alles vergleicht, einschließlich der Unendlichkeit. float("inf") < Ellipsisgibt True zurück
Singletoned
2
Ich bin mir nicht sicher über den letzten math.inf < ...oder float('inf') > Ellipsiswerfe einen TypeError: unorderable types: float() < ellipsis(), zumindest für mich.
Peter Goldsborough
2
Ich bin auf 3.5. Wahrscheinlich eine 2.x / 3.x Sache.
Peter Goldsborough
80

Seit Python 3.5 können Sie Folgendes verwenden math.inf:

>>> import math
>>> math.inf
inf
Rechtsfalte
quelle
47

Niemand scheint explizit über die negative Unendlichkeit gesprochen zu haben, also denke ich, ich sollte es hinzufügen.

Für eine positive Unendlichkeit (nur der Vollständigkeit halber):

math.inf

Für negative Unendlichkeit:

-math.inf
Sнаđошƒаӽ
quelle
30

Ich weiß nicht genau, was Sie tun, aber float("inf")Sie erhalten eine Float-Unendlichkeit, die größer ist als jede andere Zahl.

Ned Batchelder
quelle
27

In der NumPy-Bibliothek gibt es eine Unendlichkeit : from numpy import inf. Um eine negative Unendlichkeit zu erreichen, kann man einfach schreiben -inf.

Lenar Hoyt
quelle
24

Eine andere, weniger bequeme Möglichkeit, dies zu tun, ist die Verwendung von Decimalclass:

from decimal import Decimal
pos_inf = Decimal('Infinity')
neg_inf = Decimal('-Infinity')
Denis Malinovsky
quelle
21
Warum fügst du nicht hinzu, warum es weniger bequem ist und warum jemand es verwenden sollte ?
Niccolò
4
Mal sehen: Decimal('Infinity') == float('inf')kehrt zurück True, also ist es ziemlich dasselbe.
Denis Malinovsky
8
@afzal_SH float('inf') is float('inf')kehrt Falseauch zurück
nemesisdesign
4
Unendlichkeit unterscheidet sich sogar von sich selbst, so dass Ihr Kommentar für mich nicht viel Sinn machte, IMHO
nemesisdesign
5
float('inf') is float('inf')-> False, gilt nur, dass es sich um unterschiedliche Objekte mit unterschiedlichen Instanzen handelt, aber nicht, dass die internen Inhalte unterschiedlich sind - tatsächlich, wie @nemesisdesign gezeigt float('int') == float('int')hat True. Dies ist das gleiche Problem wie beim Vergleich von veränderlichen Objekten wie [1,2,3] [1,2,3] und [1,2,3] == [1,2,3], die der Reihe nach falsch sind und True .. Weitere Informationen finden Sie unter: stackoverflow.com/questions/2988017/…
Manoel Vilela
13

In python2.x gab es einen schmutzigen Hack, der diesem Zweck diente (NIEMALS verwenden, es sei denn, dies ist absolut notwendig):

None < any integer < any string

Somit ist die Überprüfung i < ''hält Truefür jede ganze Zahl i.

Es wurde in Python3 einigermaßen veraltet. Nun enden solche Vergleiche mit

TypeError: unorderable types: str() < int()
Antony Hatchkins
quelle
5
Wenn Sie dies wirklich haben, wickeln Sie es zumindest in einige lesbare Namen wie:MIN_INFINITY = None; INFINITY = "inf"; MIN_INFINITY < x < INFINITY
Ali Rasim Kocal
5
Aber Sie müssen dies nicht verwenden.
Joost
3

Auch wenn Sie SymPy verwenden, können Sie verwenden sympy.oo

>>> from sympy import oo
>>> oo + 1
oo
>>> oo - oo
nan

usw.

Victor VosMottor bedankt sich bei Monica
quelle