python中复数的平方根

Cle*_*cus 14 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)))
Run Code Online (Sandbox Code Playgroud)

给出输出

0.5j
-0.5j
Run Code Online (Sandbox Code Playgroud)

类似的事情发生在

print(sqrt(-1 * b))
print(sqrt(-b))
Run Code Online (Sandbox Code Playgroud)

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

tza*_*man 9

两个答案(+0.5j-0.5j)都是正确的,因为它们是复共轭 - 即实部是相同的,虚部是符号翻转的.

查看代码会使行为变得清晰 - 结果的虚部始终与输入的虚部具有相同的符号,如第790行和第793行所示:

r.imag = copysign(d, z.imag);
Run Code Online (Sandbox Code Playgroud)

由于a/(a-1)0.25其隐式的0.25+0j,你得到一个积极的结果; b/(b-1)产生0.25-0j(由于某种原因;不确定为什么它不会导致0.25+0jtbh)所以你的结果同样是负面的.

编辑:这个问题对同一个问题有一些有用的讨论.

  • @tzaman:这是语法中令人讨厌的边缘情况.具有负零虚构成分的复数被称为`0.2-0j`,但表达式'0.2-0j`实际上是'0.2`和'0j'的减法.减法产生*正*零虚部,因为'0j-0j'是*正*0j`.在bug追踪器上几次[出现](http://bugs.python.org/issue25839).有一个相关的问题,负的零实部分在`repr`输出中根本看不到. (3认同)