Кубический корень отрицательного числа на Python

Flareget является лучшим и самым быстрым загрузчиком. Это - альтернативная опция Of IDM for Ubuntu.

15
задан Vladimir Prudnikov 23 May 2011 в 15:34
поделиться

8 ответов

Вы можете использовать:

-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
10
ответ дан 30 November 2019 в 23:57
поделиться
math.pow(abs(x),float(1)/3) * (1,-1)[x<0]
11
ответ дан 30 November 2019 в 23:57
поделиться

Простого использования формулы Де Муавра достаточно, чтобы показать, что кубический корень значения, независимо от знака, является многозначной функцией. Это означает, что для любого входного значения будет три решения. Большинство представленных решений возвращают только основной корень. Решение, которое возвращает все допустимые корни и явно проверяет несложные особые случаи, показано ниже.

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 ]
18
ответ дан 30 November 2019 в 23:57
поделиться

Вы можете получить полное (все n корней) и более общее (любой знак, любая степень) решение, используя:

import cmath

x, t = -3., 3  # x**(1/t)

a = cmath.exp((1./t)*cmath.log(x))
p = cmath.exp(1j*2*cmath.pi*(1./t))

r = [a*(p**i) for i in range(t)]

Explanation: a использует уравнение x u = exp (u * log (x)). Это решение будет тогда одним из корней, и чтобы получить остальные, поверните его в комплексной плоскости на (полный оборот) / t.

9
ответ дан 30 November 2019 в 23:57
поделиться

Взять предыдущие ответы и превратить их в однострочник:

import math
def cubic_root(x):
    return math.copysign(math.pow(abs(x), 1.0/3.0), x)
9
ответ дан 30 November 2019 в 23:57
поделиться

Кубический корень отрицательного числа - это просто отрицательное значение кубического корня абсолютного значения этого числа.

, т.е. x ^ (1/3) для x <0 совпадает с (-1) * (| x |) ^ (1/3)

Просто сделайте ваше число положительным, а затем вычислите кубический корень.

3
ответ дан 30 November 2019 в 23:57
поделиться

Вы также можете оберните библиотеку libm , которая предлагает функцию cbrt (корень куба):

from ctypes import *
libm = cdll.LoadLibrary('libm.so.6')
libm.cbrt.restype = c_double
libm.cbrt.argtypes = [c_double]
libm.cbrt(-8.0)

дает ожидаемое

-2.0
3
ответ дан 30 November 2019 в 23:57
поделиться

Примитивное решение:

def cubic_root(nr):
   if nr<0:
     return -math.pow(-nr, float(1)/3)
   else:
     return math.pow(nr, float(1)/3)

Вероятно, в основном непифонический, но он должен работать.

0
ответ дан 30 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: