複素数を評価するとき、pythonは記号を擬似するのが好きです。複雑なリテラルの偽の解析/評価
これは、Python 3.5.0(しかし似た奇妙な問題のpython 2に存在する)
>>> -0j
(-0-0j)
>>> (-0-0j)
0j
のはなぜですか?
nb:読むときに気づいたthis質問。
複素数を評価するとき、pythonは記号を擬似するのが好きです。複雑なリテラルの偽の解析/評価
これは、Python 3.5.0(しかし似た奇妙な問題のpython 2に存在する)
>>> -0j
(-0-0j)
>>> (-0-0j)
0j
のはなぜですか?
nb:読むときに気づいたthis質問。
ここでの問題は、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トラッカーでrepeatedlyraisedとclosedであり、「バグではない」となっているため、その動作はすぐに外に出るようには見えません。複雑な数値を初期化する信頼できる方法は、complex
を組み込み呼び出すことです。
>>> 0-0j
0j
>>> 0+0j
0j
>>> complex(0, -0j)
-0j
>>> complex(0, +0j)
0j