2016-05-24 29 views
0
0 == ((-1)**.5).real 

... ist False in Python 3.5.1, während:Python: Warum scheitert die Nullerkennung nach der Berechnung von i als Exponent?

0 == complex(0,1).real 

... Wahr ist. Wie werden diese beiden Fälle unterschiedlich gehandhabt? Wann funktionieren die Nullerkennungsfunktionen der Float-Klasse und wann nicht?

+2

'(-1) ** 0,5 -> (6.123233995736766e-17 + 1 j)' auf meiner Maschine, ich würde davon ausgehen, wegen [Gleitkommamathematik] (http://stackoverflow.com/questions/588004/ is-floating-point-math-broken) –

Antwort

6
>>> (-1)**0.5 
(6.123233995736766e-17+1j) 

Das ist alles dort ist zu ihm - aufgrund Gleitkommaoperationen Tücken der Realteil des berechneten Ergebnisses ist nicht ganz genau Null. Aber im anderen Fall ist es:

>>> complex(0,1).real 
0.0 

By the way, ruft ** einen Universal Potenzierung Routine, die mehrere Schichten von Gleitkommazahlen Rundungsfehler unter der Decke ergänzt. Wenn Sie wissen, dass Sie eine Quadratwurzel wollen, ist es besser, eine Quadratwurzel-Funktion:

>>> import cmath 
>>> cmath.sqrt(-1) 
1j 
2

Die fraktionierte Leistung berechnet wird - vereinfacht etwas - wie r cis Theta. Da Theta (pi) kann nicht genau als Binärbruch dargestellt wird, ist das Ergebnis nicht genau, was man von Hand Berechnung erwarten würde. Es gibt verschiedene "gleich innerhalb einer Toleranz" -Funktionen, die Sie anwenden können, um dies zu umgehen.

+0

einige dieser Funktionen sind bereits vorhanden und funktionieren: 2 == 4 ** 0.5. Ich weiß nicht genau, wann ich davon ausgehen muss, dass sie arbeiten und wann nicht. –