Pythonの複素数の平方根でいくつかの紛らわしい動作に遭遇しました。このコードの実行:
from cmath import sqrt
a = 0.2
b = 0.2 + 0j
print(sqrt(a / (a - 1)))
print(sqrt(b / (b - 1)))
出力を与えます
0.5j
-0.5j
同様のことが起こります
print(sqrt(-1 * b))
print(sqrt(-b))
これらのステートメントのペアは同じ答えを与えるはずですか?
両方の答え(_+0.5j
_と_-0.5j
_)は正しいです。なぜなら、それらは 複素共役 -であるためです。つまり、実数部は同一であり、虚数部は符号が反転しています。
code を見ると、動作が明確になります-結果の虚数部には、常にの虚数部と同じ符号があります。行790および793に見られるように、入力:
_r.imag = copysign(d, z.imag);
_
a/(a-1)
は_0.25
_であり、暗黙的に_0.25+0j
_であるため、肯定的な結果が得られます。 b/(b-1)
は_0.25-0j
_を生成します(何らかの理由で、なぜ_0.25+0j
_ tbhにならないのかわからない)ので、結果は同様に否定的です。
編集: この質問 同じ問題についていくつかの有用な議論があります。
なぜこれが起こっているのかは答えられますが、その振る舞いが選ばれた理由は答えられません。
a/(a - 1)
0.2/-0.8と評価されます。これは-0.25であり、cmath.sqrt
によって複素数に変換されます。
b/(b - 1)
(0.2 + 0j)/(-0.8 + 0j)、つまり(-0.25-0j)に評価されます。これは、負の複素数成分を持つ複素数に変換されます。
より簡単な例として、
cmath.sqrt(0j) == 0j
cmath.sqrt(-0j) == -0j