为什么 Python 在这里创建一个复数?

Why is Python creating a complex number here?

我在 Python 3.8 中遇到一个奇怪的错误:

当我运行这个计算的时候,我得到一个复数:

>>> (1.0 / (2.0 - 0.5222232592740141 * 92.16159106468214)) ** (1.0 / (10.0 + 1))
(0.6772850578932906+0.1988688362687656j) 

但是,如果我在 Python 中手动计算,我会得到一个浮动答案:

>>> (1.0 / (2.0 - 0.5222232592740141 * 92.16159106468214))
-0.021678371395529073
>>> (1.0 / (10.0 + 1))
0.09090909090909091

>>> -0.021678371395529073 ** 0.09090909090909091
-0.7058780799007794

这是为什么?

你一开始没有考虑负面因素。 python 实际上会解释什么

-0.021678371395529073 ** 0.09090909090909091 真的-(0.021678371395529073 ** 0.09090909090909091)

所以做2个正数的幂然后应用负数。但是,如果您将第一个数字和负数一起包装到 python 知道负数适用于第一个数字而不仅仅是表达式的净结果,您会得到复数

(-0.021678371395529073) ** 0.09090909090909091
(0.6772850578932906+0.1988688362687656j)

这就是您的真实示例中发生的情况,因为 python 知道项是负数,而不是结果

要解释为什么会发生这种情况,您必须查看操作顺序。在您的表达式中,您有两个操作 -** 并且您有两个术语 0.0216783713955290730.09090909090909091

下方 table 列出了操作顺序,table 中排名靠前的优先执行。

Operator

Description
()  Parentheses (grouping)
f(args...)  Function call
x[index:index]  Slicing
x[index]    Subscription
x.attribute Attribute reference
**  Exponentiation
~x  Bitwise not
+x, -x  Positive, negative
*, /, % Multiplication, division, remainder
+, -    Addition, subtraction
<<, >>  Bitwise shifts
&   Bitwise AND
^   Bitwise XOR
|   Bitwise OR
in, not in, is, is not, <, <=,  >,  >=,
<>, !=, ==  Comparisons, membership, identity
not x   Boolean NOT
and Boolean AND
or  Boolean OR
lambda  Lambda expression

由此 table 可以看出求幂 (**) 的先例高于取反 (-x)。因此,这意味着 python 将首先计算两项的幂,然后对其结果应用否定。因此,如果您希望在求幂之前对第一个数字应用否定,则需要将其括在括号中。

希望解释清楚

>>> -0.021678371395529073 ** 0.09090909090909091
-0.7058780799007794
>>> (-0.021678371395529073) ** 0.09090909090909091
(0.6772850578932906+0.1988688362687656j)
>>> 0.021678371395529073 ** 0.09090909090909091
0.7058780799007794