2017-06-22 63 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中進行了更改,您可以升級並在沒有問題的情況下運行表達式。 –