python上负数的三次方根

2024-04-25 05:12:09 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能帮我找到一个用python计算负数立方根的方法吗?

>>> math.pow(-3, float(1)/3)
nan

它不起作用。负数的立方根是负数。有什么解决办法吗?


Tags: 方法mathnanfloat负数pow解决办法
3条回答

只要简单地使用De Moivre's formula,就足以表明值的立方根(不管符号是什么)是一个多值函数。这意味着,对于任何输入值,都有三种解决方案。提出的大多数解决方案只返回原理根。返回所有有效根并显式测试非复杂特殊情况的解决方案如下所示。

import numpy
import math
def cuberoot( z ):
    z = complex(z)
    x = z.real
    y = z.imag
    mag = abs(z)
    arg = math.atan2(y,x)
    return [ mag**(1./3) * numpy.exp( 1j*(arg+2*n*math.pi)/3 ) for n in range(1,4) ]

编辑:根据请求,在不适合依赖numpy的情况下,以下代码也会执行相同的操作。

def cuberoot( z ):
    z = complex(z) 
    x = z.real
    y = z.imag
    mag = abs(z)
    arg = math.atan2(y,x)
    resMag = mag**(1./3)
    resArg = [ (arg+2*math.pi*n)/3. for n in range(1,4) ]
    return [  resMag*(math.cos(a) + math.sin(a)*1j) for a in resArg ]

您可以使用:

-math.pow(3, float(1)/3)

或者更普遍地说:

if x > 0:
    return math.pow(x, float(1)/3)
elif x < 0:
    return -math.pow(abs(x), float(1)/3)
else:
    return 0
math.pow(abs(x),float(1)/3) * (1,-1)[x<0]

相关问题 更多 >