发生的情况是 -1 的平方根计算为 exp(i phase/2),其中(-1 的)相位约为π。实际上,
>>> import cmath, math
>>> z = -1+0j
>>> cmath.phase(z)
3.141592653589793
>>> math.cos(_/2)
6.123233995736766e-17
这说明-1的相位是π只到几个1e-17;相位除以 2 也仅约为 π/2,其余弦仅约为 0,因此您的结果(结果的实部就是该余弦)。
问题最终来自这样一个事实,即只有固定的、有限数量的浮点数。数字 π 不在浮点数列表中,因此只能近似表示。π/2 也不能精确表示,因此 -1 的平方根的实部是 π/2 的浮点近似的余弦(因此余弦不同于 0)。
因此,Python 的近似值numpy.power(complex(-1), .5)
最终是由于浮点数的限制,并且很可能在许多语言中都可以找到。
您观察到的情况与此浮点限制有关,通过执行数字的幂。在您的示例中,平方根是通过评估复数的模块和参数来计算的(主要是通过 log 函数,它返回 log(module) + i 阶段)。另一方面,cmath.sqrt(-1)
给出正是1j
因为它使用了不同的方法,并且不受(-1+0j)**0.5
(如 TonyK 所建议的)的浮点逼近问题的影响。