2015-06-18 97 views
4

的Python 3.4看似隨機決定是否返回使用**運營商的實數或複數根:如何在Python3中獲取負數的實數立方根?

>>> (863.719-2500) 
-1636.281 
>>> -1636.281**(1/3) 
-11.783816270504108 
>>> (863.719-2500)**(1/3) 
(5.891908135252055+10.205084243784958j) 

有沒有一種方法,以確保你當立方體生根,而不是複雜的一個真正根源那些?

+1

在你的第一個例子中,操作的順序,意味着你正在服用的積極1636.281立方根,然後取結果不利。 – BrenBarn

+0

這不是隨機的,而是將'z ** p'定義爲'exp(p * log(z))'的結果,其中複數對數有一個分支切割,將其虛部置於區間(-π,π) 。 – dan04

回答

5

在第二種情況下,實際上立方體根是首先被評估,然後減號被應用,因此是真正的根。

-1636.281**(1/3)變成-(1636.281**(1/3))。你也可以使用類似的邏輯來獲得真實的立方根。

但實際上,當做負數的立方根時,你總是會在python中得到複數。

>>> -1636.281**(1/3) 
-11.783816270504108 
>>> (-1636.281)**(1/3) 
(5.891908135252055+10.205084243784958j) 

如果你想真正的號碼,你可以像添加代碼 -

def cube(x): 
    if x >= 0: 
     return x**(1/3) 
    elif x < 0: 
     return -(abs(x)**(1/3)) 
+0

噢,這可以解釋奇怪的行爲。此外,代碼可以改善,因爲0 **(1/3)是0,如果x> = 0,則可以執行操作:... else:... –

+0

我沒有' t瞭解關於'0'的註釋,它已經爲'0'返回'0' –

+0

是的,正確的,抱歉的複製粘貼錯誤:) –