基本算术运算Python中的歧义

时间:2017-06-22 13:40:22

标签: python python-2.x arithmetic-expressions

以下是该方案:

In [5]: (2.0 - 5.0**(0.5)) ** (1.0/3.0)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-d064023f1ac5> in <module>()
----> 1 (2.0 - 5.0**(0.5)) ** (1.0/3.0)

ValueError: negative number cannot be raised to a fractional power

In [7]: -1.0 ** (1.0/3.0)
Out[7]: -1.0

上面的操作是在python解释器上完成的。对于第一个表达式,它给出了值错误,并说negative number can't have fractional power !!所以,首先,为什么这个错误很明显,-ve数字可以有立方根或第五根等。另外,如果是这种情况,它应该是一致的,而在第二种情况下,当-1被提升到时,它不会产生错误分数幂(1/3)。

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

**运算符具有特定的绑定行为;来自power operator文档:

  

权力运算符比左边的一元运算符绑定得更紧密;它比右边的一元运算符更紧密。

     

[...]

     

因此,在功率和一元运算符的未加密集的序列中,运算符从右到左进行求值(这不会限制操作数的求值顺序):-1**2得到-1。< / p>

所以第二个示例执行为:

-(1.0 ** (1.0/3.0))

也就是说,-一元运算符适用于**的结果,因为该运算符绑定得更紧密。结果你将正数提升到1/3的幂,然后才变为负数。

第一个示例中,表达式被解析为

(2.0 - (5.0**(0.5))) ** (1.0/3.0)

此处没有一元运算符,但**幂运算符的优先级高于二元-减法运算符。

然后解析为

(2.0 - 2.23606797749979) ** (1.0/3.0)

(-0.2360679774997898) ** (1.0/3.0)

所以试图将负数提升到一个分数。

Python 2 **(以及pow()函数)在输入最多为float个对象时,不支持生成复数支持。首先将负浮点值转换为complex()数字:

>>> (-1.0) ** 0.5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: negative number cannot be raised to a fractional power
>>> (-1+0j) ** 0.5
(6.123233995736766e-17+1j)
>>> (2+0j - 5.0**(0.5)) ** (1.0/3.0)
(0.30901699437494756+0.535233134659635j)

这在Python 3中发生了变化,其中返回了一个复数结果,负数被提升到一个小数幂。