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