2015-01-02 24 views
34

W natywnym języku Python, bez użycia NumPy (dla którego numpy.nan != numpy.nan) nie ma NaN, więc czy mam rację sądząc, że zmiennoprzecinkowy język Pythona == jest refleksyjny? Następnie, ponieważ jest symetryczny (a == b implikuje b == a) i przechodni (jeśli a==b i b==c następnie a==c), możemy powiedzieć, że Pythona == jest relacją równoważności na float s?Czy Pythona == relacja równoważności na pływaki?

EDIT: OK, więc dowiedziałem się, że jest tam NaN: float('nan') (dzięki @unutbu), która będzie propagować poprzez różne działania, ale nie każdy rodzimy metoda Python zwraca go (zamiast podnoszenie wyjątek) bez wprowadzania mnie to przez to zadanie?

+0

Nie wiedziałem tego: dziękuję. Czy 'nan' faktycznie jest zwracany przez jakąkolwiek natywną operację w Pythonie (zamiast wywoływanego wyjątku)? – xnx

+8

@xnx: '1e400/1e400' zwraca' nan'. –

+0

Zobacz także [PEP 754] (https://www.python.org/dev/peps/pep-0754/), aby uzyskać więcej informacji na ten temat. –

Odpowiedz

45

== jest zwrotna dla wszystkich liczb, zero, -ZERO, ininity i + infinity, ale nie dla nan.

Można uzyskać inf, -inf i nan w rodzimym języku Python po prostu operacji arytmetycznych na literałów, jak poniżej.

one zachowywać poprawnie, jak w IEEE 754 i bez wyjątku domeny matematyki:

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

1e1000 jest bardzo duża liczba, więc unoszą się i dwukrotnie reprezentowania go jako nieskończoności.

  • nieskończoności jest równa nieskończoności
  • nieskończoność dzielona przez nieskończoność nie jest liczbą
  • a nie ilość! = Nie liczba

arytmetyki zmiennoprzecinkowej w Pythonie działa również OK do nieskończoności minus nieskończoności itp .:

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

a dla przypadku zerowego i minus zera:

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

Dla kompletności pomocne może być podanie (krótkiej) listy aksjomatów, które tworzą relację równoważności. Ponadto nigdy nie mówisz wprost, że nie jest to relacja równoważności, po prostu mówisz, że nie jest refleksyjna dla 'nan'. – Logan

34

float('nan') istnieje w natywnym Pythonie i float('nan') != float('nan'). Więc nie, == nie jest equivalence relation ponieważ brakuje refleksyjność:

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