2016-04-13 9 views
0

複素数を評価するとき、pythonは記号を擬似するのが好きです。複雑なリテラルの偽の解析/評価

これは、Python 3.5.0(しかし似た奇妙な問題のpython 2に存在する)

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

のはなぜですか?

nb:読むときに気づいたthis質問。

答えて

4

ここでの問題は、Pythonは、リテラルとして(-0-0j)として複素数を解析されないことを、彼らは実際に式として解析されている。

>>> 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)))])' 

だから、これは複雑なリテラルが、int型の引き算ではありません複雑です。

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

INT部が0J複合成分を有するとし、その後、我々は理由複合体成分の減算の結果から予想されるsigned zeroを失っています。 0j - 0jの結果は、IEEE 754-2008が示すように、正の符号を持つ必要があります。

ゼロの符号が方程式の解に影響する可能性があるため、これはおそらくパーサーの問題です。しかし、問題はpythonトラッカーでrepeatedlyraisedclosedであり、「バグではない」となっているため、その動作はすぐに外に出るようには見えません。複雑な数値を初期化する信頼できる方法は、complexを組み込み呼び出すことです。

>>> 0-0j 
0j 
>>> 0+0j 
0j 
>>> complex(0, -0j) 
-0j 
>>> complex(0, +0j) 
0j 
関連する問題