2017-06-22 69 views
0

下面是这种情况:歧义基本的算术运算的Python

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

你使用的是Python 2不是吗?)在py3k中,实际工作得到(0.30901699437494756 + 0。535233134659635j) –

+0

yes,它的python2 – vish4071

+0

然后只是复杂的((2.0 - 5.0 **(0.5)))**(1.0/3.0) –

回答

1

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

电源运算符绑定比其左侧的一元运算符更紧密;它与右侧的一元运算符的绑定更紧密。

[...]

因此,在功率和一元运算符的括号的序列中,运营商正从右到左进行评估(这不限制为操作数的评价顺序):-1**2结果-1

所以你例如执行为:

-(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中,其中一个复杂的结果返回提高到分数功率为负数。

+0

但仍然,为什么立方根到-ve数是一个复数? – vish4071

+0

@ vish4071:如果您想要复杂的数字输出,请将复数*放在*中。数字上的Python算术运算符将首先转换为通用类型,并且操作的结果将是该常见类型。如果你将'int'和'float'混合在一起,所有的东西首先被转换为'float',而输出是'float'。如果方程中没有复数,你仍然可以得到'float'输出。 –

+1

@ vish4071:请注意,他在Python 3中进行了更改,您可以升级并在没有问题的情况下运行表达式。 –