python中复数的平方根

时间:2016-04-12 21:32:52

标签: python math complex-numbers

我遇到了一些令人困惑的行为,在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))

看来这些陈述应该给出相同的答案吗?

2 个答案:

答案 0 :(得分:9)

两个答案(+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对同一问题进行了一些有用的讨论。

答案 1 :(得分:1)

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

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