2015-01-02 10 views
34

In nativem Python, ohne NumPy zu verwenden (für das numpy.nan != numpy.nan) gibt es kein NaN, also habe ich Recht mit dem Gedanken, dass Pythons Fließkomma == ist reflexiv? Dann, da es symmetrisch ist (a == b bedeutet b == a) und transitive (wenn a==b und b==c dann a==c), können wir sagen, dass Pythons == eine Äquivalenzrelation auf der float s ist?Ist Pythons == eine Äquivalenzrelation auf den Floats?

EDIT: OK, so habe ich gelernt, dass es ist ein NaN: float('nan') (dank @unutbu), die durch verschiedene Operationen propagieren, aber nicht jede nativen Python-Methode gibt es (eher als eine Ausnahme Erhöhung), ohne dass ich die Einführung es durch diese Aufgabe?

+0

Ich wusste das nicht: danke. Wird 'nan' tatsächlich von einer nativen Python-Operation zurückgegeben (anstatt dass eine Exception ausgelöst wird)? – xnx

+8

@xnx: '1e400/1e400' gibt' nan' zurück. –

+0

Siehe auch [PEP 754] (https://www.python.org/dev/peps/pep-0754/) für weitere Hintergrundinformationen dazu. –

Antwort

45

== ist reflexiv für alle Zahlen, null, -Nullsignal, ininity und -unendlich, aber nicht für nan.

Sie können inf, -inf und nan in systemeigenem Python nur durch arithmetische Operationen für Literale wie unten erhalten.

verhalten sich diese korrekt, wie in IEEE 754 und ohne Ausnahme math Domain:

>>> 1e1000 == 1e1000 
True 
>>> 1e1000/1e1000 == 1e1000/1e1000 
False 

1e1000 eine sehr große Zahl ist, so schweben und Doppel repräsentieren sie als unendlich.

  • unendlich ist gleich unendlich
  • unendlich durch unendlich geteilt keine Zahl ist
  • nicht eine Zahl! = Keine Zahl

Gleitkomma-Arithmetik in Python funktioniert auch OK für die Unendlichkeit minus unendlich etc .:

>>> x = 1e1000 
>>> x 
inf 
>>> x+x 
inf 
>>> x-x 
nan 
>>> x*2 
inf 
>>> x == x 
True 
>>> x-x == x-x 
False 
>>> 

und für die Null und minus Null Fall:

>>> inf = float("inf") 
>>> 1/inf 
0.0 
>>> -1/inf 
-0.0 
>>> -1/inf == 1/inf 
True 
>>> 
+2

Der Vollständigkeit halber könnte es hilfreich sein, die (kurze) Axiomenliste aufzunehmen, die eine Äquivalenzrelation ergibt. Außerdem sagt man nie explizit, dass es keine Äquivalenzbeziehung ist, man sagt einfach, dass es für "nan" nicht reflexiv ist. – Logan

34

float('nan') existiert in nativem Python und float('nan') != float('nan'). Also nein, ist == kein equivalence relation da es Reflexivität fehlt:

In [40]: float('nan') == float('nan') 
Out[40]: False 
Verwandte Themen