如何在Python3中获得负数的真实立方根?
Python 3.4似乎随机决定使用如何在Python3中获得负数的真实立方根?,python,python-3.x,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) 是否有办法确保在多维数据集根生成时得到实根而不是复杂根?在第二种情况下,实际上首先计算
**
运算符返回数字的实根还是复数根:
>>> (863.719-2500)
-1636.281
>>> -1636.281**(1/3)
-11.783816270504108
>>> (863.719-2500)**(1/3)
(5.891908135252055+10.205084243784958j)
是否有办法确保在多维数据集根生成时得到实根而不是复杂根?在第二种情况下,实际上首先计算多维数据集根,然后应用减号,从而得到实根 也就是说,
-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))
def多维数据集(x):
如果x>=0:
返回x**(1/3)
elif x<0:
返回-(abs(x)**(1/3))
在幂运算符和一元运算符的非偶合序列中,运算符从右向左求值(这不限制操作数的求值顺序):-1**2
产生-1
那么你的表情呢
-1636.281**(1/3)
实际评估为
-(1636.281**(1/3))
在第一个示例中,运算顺序意味着取正1636.281的立方根,然后取结果的负数。这不是随机的,而是将
z**p
定义为exp(p*log(z))
的结果,其中复对数有一个分支切割,将其虚部放在区间中(-π,π)。哦,这就解释了奇怪的行为。另外,代码可以改进,因为0**(1/3)是0,如果x>=0,你可以这样做:…否则:…我不理解关于0
的评论,它已经返回0
for0