问题描述
当我运行这个计算时,我得到一个复数:
>>> (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.021678371395529073
,0.09090909090909091
下表列出了操作的顺序,在表中出现的更高的先完成。
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
从这个表中你可以看到指数(**)比否定(-x)有更高的先例。所以这意味着 python 将首先提高这两个项的幂,然后将否定应用于其结果。因此,如果您希望在求幂之前将否定应用于第一个数字,那么您需要将其括在括号中。
,希望能解释
>>> -0.021678371395529073 ** 0.09090909090909091
-0.7058780799007794
>>> (-0.021678371395529073) ** 0.09090909090909091
(0.6772850578932906+0.1988688362687656j)
>>> 0.021678371395529073 ** 0.09090909090909091
0.7058780799007794