Python Unendlichkeit - Alle Einsprüche?
Frage
So Python hat positive und negative Unendlichkeit:
float("inf"), float("-inf")
Dies scheint nur, wie die Art der Funktion, die eine gewisse Einschränkung haben muss. Gibt es etwas, das ich bewusst sein sollten?
Lösung
Sie können nach wie vor nicht-a-Zahl (NaN) Werte von einfachen arithmetischen Beteiligung inf
bekommen:
>>> 0 * float("inf")
nan
Beachten Sie, dass Sie in der Regel nicht einen inf
Wert durch üblichen arithmetische Berechnungen erhalten:
>>> 2.0**2
4.0
>>> _**2
16.0
>>> _**2
256.0
>>> _**2
65536.0
>>> _**2
4294967296.0
>>> _**2
1.8446744073709552e+19
>>> _**2
3.4028236692093846e+38
>>> _**2
1.157920892373162e+77
>>> _**2
1.3407807929942597e+154
>>> _**2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
OverflowError: (34, 'Numerical result out of range')
Der inf
Wert ist ein ganz besonderer Wert mit ungewöhnlicher Semantik betrachtet, so ist es besser, über eine OverflowError
sofort durch eine Ausnahme zu wissen, anstatt einen inf
Wert geräuschlos in den Berechnungen eingespritzt wird.
Andere Tipps
Python-Implementierung folgt die IEEE-754-Standard ziemlich gut, die Sie als Anleitung verwenden können, aber es stützt sich auf das zugrunde liegende System kompiliert auf wurde, so < a href = "http://www.python.org/dev/peps/pep-0754/" rel = "noreferrer"> Plattform Unterschiede auftreten können. Recently¹, ein Update angewendet wurde, die „unendlich“ sowie „inf“ erlaubt , aber das ist von untergeordneter Bedeutung.
In den folgenden Abschnitten gleich gut in jede Sprache anzuwenden, die richtig IEEE Gleitkomma-Arithmetik implementiert, es ist nicht spezifisch für nur Python.
Vergleich auf Ungleichheit
Wenn mit der Unendlichkeit zu tun und Größer-als >
oder weniger als <
Betreiber die folgenden zählt:
- eine beliebige Zahl einschließlich
+inf
höher als-inf
- eine beliebige Zahl einschließlich
-inf
niedriger als+inf
-
+inf
ist weder höher noch niedriger als+inf
-
-inf
ist weder höher noch niedriger als-inf
- jeder Vergleich
NaN
beteiligt ist falsch (inf
ist weder höher noch niedriger alsNaN
)
Vergleich für Gleichheit
Im Vergleich zur Gleichheit, +inf
und +inf
gleich ist, wie -inf
und -inf
sind. Dies ist eine viel diskutierte Frage und klingen mag kontrovers zu Ihnen, aber es ist in dem IEEE-Standard und Python verhält sich einfach so.
Natürlich +inf
ungleich ist und alles -inf
, einschließlich NaN
selbst, ist ungleich NaN
.
Die Berechnungen mit unendlich
Die meisten Berechnungen mit unendlich wird unendlich ergeben, es sei denn, beide Operanden unendlich sind, wenn die Operation Division oder Modulo, oder mit der Multiplikation mit Null, gibt es einige besondere Regeln zu beachten:
- , wenn sie von Null multipliziert wird, für die das Ergebnis nicht definiert ist, liefert es
NaN
- when Dividieren beliebige Anzahl (außer infinity selbst) durch Unendlichkeit, die
0.0
oder-0.0
ergibt ² . - , wenn (einschließlich Modulo) positive oder negative Unendlichkeit durch positive oder negative Unendlichkeit Dividieren, ist das Ergebnis nicht definiert, so
NaN
. - wenn subtrahieren, können die Ergebnisse überraschend sein, aber folgen gemeinsame mathematische Sinn :
- wenn
inf - inf
tun, ist das Ergebnis nicht definiert:NaN
; - wenn
inf - -inf
tun, ist das Ergebnisinf
; - wenn
-inf - inf
tun, ist das Ergebnis-inf
; - wenn
-inf - -inf
tun, wird das Ergebnis nicht definiert.NaN
- wenn
- beim Hinzufügen, kann es auch in ähnlicher Weise überraschend sein:
- wenn
inf + inf
tun, ist das Ergebnisinf
; - wenn
inf + -inf
tun, ist das Ergebnis nicht definiert:NaN
; - wenn
-inf + inf
tun, ist das Ergebnis nicht definiert:NaN
; - wenn
-inf + -inf
tun, ist das Ergebnis-inf
.
- wenn
- mit
math.pow
,pow
oder**
ist schwierig, da es nicht so verhalten, als es sollte. Es löst eine Überlaufausnahme, wenn das Ergebnis mit zwei reellen Zahlen zu hoch ist, einen doppelten Genauigkeit Schwimmer passen (es sollte infinit zurückkehreny), aber wenn der Einganginf
oder-inf
ist, verhält er sich richtig und gibt entwederinf
oder0.0
. Wenn das zweite ArgumentNaN
ist, gibt esNaN
, es sei denn, das erste Argument1.0
ist. Es gibt mehr Fragen, nicht alle in der Dokumentation bedeckt . -
math.exp
leidet die gleichen Fragen wiemath.pow
. Eine Lösung dieses Problem zu beheben für Überlauf Code verwenden, ähnlich wie folgt aus:try: res = math.exp(420000) except OverflowError: res = float('inf')
Notizen
Hinweis 1: als zusätzliche Einschränkung, dass durch den IEEE-Standard definiert, wenn Ihr Berechnungser unter-oder überläuft, wird das Ergebnis nicht ein Unter- oder Überlauffehler, aber positiv oder negative Unendlichkeit. 1e308 * 10.0
Ausbeuten inf
Hinweis 2: , weil jede Berechnung mit NaN
NaN
und keinen Vergleich gibt NaN
, einschließlich NaN
selbst false
ist, sollten Sie die math.isnan
Funktion, um zu bestimmen, ob eine Zahl ist in der Tat NaN
.
Hinweis 3: obwohl Python float('-NaN')
Schreiben unterstützt, wird das Zeichen ignoriert, weil es intern keine Anzeichen auf NaN
existiert. Wenn Sie -inf / +inf
teilen, ist das Ergebnis NaN
ist, -NaN
nicht (es gibt nicht so etwas).
Hinweis 4: vorsichtig sein, auf eine der oben verlassen, wie Python auf der Bibliothek C oder Java setzt sie für und nicht alle zugrunde liegenden Systeme kompiliert wurden implementieren all dieses Verhalten korrekt. Wenn Sie sicher sein wollen, Test für die Unendlichkeit vor Ihren Berechnungen zu tun.
¹) bedeutet Kürzlich seit Version 3.2 .
²) Gleitpunkte unterstützen positive und negative Null, so: x / float('inf')
sein Vorzeichen und -1 / float('inf')
Ausbeuten -0.0
hält, 1 / float(-inf)
Ausbeuten -0.0
, 1 / float('inf')
Ausbeuten 0.0
und -1/ float(-inf)
0.0
Ausbeuten. Darüber hinaus 0.0 == -0.0
ist true
, müssen Sie manuell die Zeichen überprüfen, ob Sie nicht wollen, es um wahr zu sein.
Das Gleiche gilt für C99 .
Die IEEE 754 Floating-Point-Darstellung von allen modernen Prozessoren hat einigen speziellen Bitmuster für positive Unendlichkeit reserviert verwendet (Vorzeichen = 0 exp = ~ 0, frac = 0), negative Unendlichkeit (Zeichen = 1, exp = ~ 0, frac = 0), und viele NaN (Not a Number: exp = ~ 0, frac ≠ 0)
.Alles, was Sie brauchen, um Sorgen zu machen. Einige Arithmetik verursachen Punkt Ausnahmen / Fallen schwimmen, aber die sind nur auf diese „interessant“ Konstanten nicht beschränkt
fand ich einen Vorbehalt, dass bisher niemand erwähnt hat. Ich weiß nicht, ob es oft in praktischen Situationen kommen wird, aber hier ist es aus Gründen der Vollständigkeit.
In der Regel eine Zahl Modulo unendlich Berechnung kehrt sich als Schwimmer, sondern eine Fraktion Modulo unendlich kehrt nan
(keine Zahl). Hier ein Beispiel:
>>> from fractions import Fraction
>>> from math import inf
>>> 3 % inf
3.0
>>> 3.5 % inf
3.5
>>> Fraction('1/3') % inf
nan
Ich legte ein Problem auf dem Python Bug-Tracker. Es kann unter https://bugs.python.org/issue32968 gesehen werden.
Update. Das wird Fest in Python 3.8