python 中复数的平方根

Square root of complex numbers in 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))

看起来这几对陈述应该给出相同的答案?

两个答案(+0.5j-0.5j)都是正确的,因为它们是 complex conjugates——即实部相同,虚部符号翻转。

查看 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)所以你的结果同样是负面的。

编辑:This question 对同一问题进行了一些有用的讨论。

我可以回答为什么会这样,但不能回答为什么选择这种行为。

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