如何在Python3中获得负数的真正立方根?

时间:2015-06-18 19:13:09

标签: python python-3.x

Python 3.4似乎随机决定是否使用**运算符返回数字的实数或复数根:

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

有没有办法确保你在立方体生根时获得真正的根,而不是复杂的根?

2 个答案:

答案 0 :(得分:6)

在第二种情况下,实际上是首先评估立方体根,然后应用减号,因此是真正的根。

-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))

答案 1 :(得分:1)

https://docs.python.org/3/reference/expressions.html#the-power-operator

  

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

所以你的表达

-1636.281**(1/3)

实际上被评估为

-(1636.281**(1/3))