python: 为什么float的零检测在将i计算为指数后失败?

python: why does float's zero detection fail after calculating i as an exponent?

0 == ((-1)**.5).real

... 在 python 3.5.1 中为 False,而:

0 == complex(0,1).real

... 是正确的。这两个案件的处理方式有何不同?浮点数 class 的零检测功能何时起作用,何时不起作用?

>>> (-1)**0.5
(6.123233995736766e-17+1j)

仅此而已 - 由于浮点变幻莫测,计算结果的实部并不完全为零。但在你的另一种情况下是:

>>> complex(0,1).real
0.0

顺便说一下,** 调用了一个通用的求幂例程,它在幕后添加了几层浮点舍入误差。如果你知道你想要平方根,最好使用平方根函数:

>>> import cmath
>>> cmath.sqrt(-1)
1j

计算分次幂——稍微简化——为r cis theta。由于 theta (pi) 不能精确地表示为二进制小数,因此结果 并不完全 您希望通过手算得到的结果。您可以应用各种 "equal within a tolerance" 函数来解决此问题。