Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung zum Urteil von Inf und Nan in Python

Ausführliche Erklärung zum Urteil von Inf und Nan in Python

高洛峰
高洛峰Original
2017-02-10 10:02:462245Durchsuche

Dieser Artikel stellt hauptsächlich das Problem der Beurteilung von Inf und Nan in Python vor. Der Artikel stellt es ausführlich vor und hat einen gewissen Referenzwert für alle Freunde, die es brauchen.

Jeder weiß, dass man in Python positive und negative Unendlichkeiten auf folgende Weise ausdrücken kann:

float("inf") # 正无穷
float("-inf") # 负无穷

Verwenden Sie inf(infinite), um zu multiplizieren um 0. Holen Sie sich not-a-number(NaN). Wenn eine Zahl größer als unendlich ist, handelt es sich um eine NaN(not a number)-Zahl. In einer NaN-Zahl ist ihr Exponententeil der maximal ausdrückbare Wert, der FF (einfache Genauigkeit), 7FF (doppelte Genauigkeit) und 7FFF (erweiterte doppelte Genauigkeit) ist. Der Unterschied zwischen NaN-Zahlen und unendlichen Zahlen besteht darin, dass der Signifikantenteil der unendlichen Zahl 0 ist (Bit63 mit erweiterter doppelter Genauigkeit ist 1, während der Signifikantenteil der NaN-Zahl nicht 0 ist).

Sehen wir uns zunächst den folgenden Code an:

>>> inf = float("inf")
>>> ninf = float("-inf")
>>> nan = float("nan")
>>> inf is inf
True
>>> ninf is ninf
True
>>> nan is nan
True
>>> inf == inf
True
>>> ninf == ninf
True
>>> nan == nan
False
>>> inf is float("inf")
False
>>> ninf is float("-inf")
False
>>> nan is float("nan")
False
>>> inf == float("inf")
True
>>> ninf == float("-inf")
True
>>> nan == float("nan")
False

Wenn Sie noch nicht versucht haben, in Python zu urteilen Unabhängig davon, ob eine Gleitkommazahl NaN ist, werden Sie vom obigen Ausgabeergebnis auf jeden Fall überrascht sein. Erstens: Wenn Sie is verwenden, um mit positiver und negativer Unendlichkeit und NaN selbst zu operieren, scheint es hier kein Problem zu geben, aber wenn Sie == verwenden, um zu operieren, ist das Ergebnis anders und NaN wird False . Wenn Sie eine Variable mit float neu definieren und sie mit is und == vergleichen, ist das Ergebnis immer noch unerwartet. Die Gründe für diese Situation sind etwas kompliziert, daher werde ich hier nicht näher darauf eingehen. Wenn Sie interessiert sind, können Sie die relevanten Informationen überprüfen.

Wenn Sie Inf- und Nan-Werte korrekt ermitteln möchten, dann sollten Sie die Funktionen math.isinf und math.isnan des Mathematikmoduls verwenden:

>>> import math
>>> math.isinf(inf)
True
>>> math.isinf(ninf)
True
>>> math.isnan(nan)
True
>>> math.isinf(float("inf"))
True
>>> math.isinf(float("-inf"))
True
>>> math.isnan(float("nan"))
True

Das wird korrekt sein. Während ich gerade beim Thema bin, hier noch ein Ratschlag: Versuchen Sie nicht, is und == zu verwenden, um zu bestimmen, ob ein Objekt in Python unendlich oder NaN ist. Benutzen Sie das Mathematikmodul einfach gehorsam, sonst geraten Sie in Schwierigkeiten.

Natürlich gibt es auch andere Möglichkeiten, Urteile zu fällen. Im Folgenden wird NaN als Beispiel verwendet. Es wird jedoch dennoch empfohlen, das Mathematikmodul zu verwenden, um Verwirrung zu vermeiden.

Verwenden Sie das Objekt selbst, um sich selbst zu beurteilen

>>> def isnan(num):
...  return num != num
... 
>>> isnan(float("nan"))
True

Verwenden Sie die Funktionen von das Numpy-Modul

>>> import numpy as np
>>> 
>>> np.isnan(np.nan)
True
>>> np.isnan(float("nan"))
True
>>> np.isnan(float("inf"))
False

Numpys Isnan-Funktion kann auch die gesamte Liste beurteilen:

>>> lst = [1, float("nan"), 2, 3, np.nan, float("-inf"), 4, np.nan]
>>> lst
[1, nan, 2, 3, nan, -inf, 4, nan]
>>> np.isnan(lst)
array([False, True, False, False, True, False, False, True], dtype=bool)

Das np.isnan hier gibt ein Array boolescher Werte zurück. Wenn die entsprechende Position NaN ist, wird True zurückgegeben, andernfalls wird False zurückgegeben.

Ausführlichere Erläuterungen zum Urteil von Inf und Nan in Python finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn