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?

War es hilfreich?

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 als NaN)

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 Ergebnis inf;
    • wenn -inf - inf tun, ist das Ergebnis -inf;
    • wenn -inf - -inf tun, wird das Ergebnis nicht definiert. NaN
  • beim Hinzufügen, kann es auch in ähnlicher Weise überraschend sein:
    • wenn inf + inf tun, ist das Ergebnis inf;
    • 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.
  • 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 Eingang inf oder -inf ist, verhält er sich richtig und gibt entweder inf oder 0.0. Wenn das zweite Argument NaN ist, gibt es NaN, es sei denn, das erste Argument 1.0 ist. Es gibt mehr Fragen, nicht alle in der Dokumentation bedeckt .
  • math.exp leidet die gleichen Fragen wie math.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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top