web-dev-qa-db-ja.com

pythonの複素数の平方根

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

これらのステートメントのペアは同じ答えを与えるはずですか?

15
CleptoMarcus

両方の答え(_+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にならないのかわからない)ので、結果は同様に否定的です。

編集: この質問 同じ問題についていくつかの有用な議論があります。

9
tzaman

なぜこれが起こっているのかは答えられますが、その振る舞いが選ばれた理由は答えられません。

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
1
Matt Jordan