2016-04-13 11 views
0

Bei der Auswertung von komplexen Zahlen, Python gerne die Zeichen geige.Bogus Parsing/Eval von komplexen Literalen

Dies ist Python 3.5.0 (aber ähnlich seltsame Probleme in Python existieren 2)

>>> -0j 
(-0-0j) 
>>> (-0-0j) 
0j 

Warum?

nb: Ich bemerkte es beim Lesen this Frage.

Antwort

4

Die hier Problem ist, dass Python nicht komplexe Zahlen wie (-0-0j) nicht analysieren als Literale, sie als Ausdruck tatsächlich analysiert werden:

>>> import ast 
>>> ast.dump(ast.parse('(-0-0j)')) 
'Module(body=[Expr(value=BinOp(left=UnaryOp(op=USub(), operand=Num(n=0)), op=Sub(), right=Num(n=0j)))])' 

Also, das ist nicht ein komplexes wörtlichen, sondern eine Subtraktion von int und komplex.

>>> -0-0j 
0j 
>>> (0j).__rsub__((0).__neg__()) 
0j 

Der int Teil wird als mit einer 0j komplexen Komponente genommen, und dann verlieren wir die signed zero aus dem Ergebnis zu erwarten, da der Subtraktion der komplexen Komponenten. Das Ergebnis von 0j - 0j sollte ein positives Vorzeichen haben, wie es IEEE 754-2008 vorschreibt.

Dies ist wohl ein Parser-Problem, weil das Vorzeichen der Null die Lösungen von Gleichungen beeinflussen kann. Allerdings war das Problem repeatedlyraised und closed auf dem Python-Tracker als "kein Fehler", so dass es nicht so aussehen wird, dass dieses Verhalten bald weggehen wird. Der zuverlässige Weg, komplexe Zahlen zu initialisieren, ist der Aufruf complex eingebaut:

>>> 0-0j 
0j 
>>> 0+0j 
0j 
>>> complex(0, -0j) 
-0j 
>>> complex(0, +0j) 
0j 
Verwandte Themen