2011-12-13 85 views
12

在現實世界中立方根爲負數應該存在: cuberoot(-1)=-1,這意味着(-1)*(-1)*(-1)=-1cuberoot(-27)=-3,這意味着(-3)*(-3)*(-3)=-27Ç - 尋找具有POW功能負數的立方根

但是,當我計算立方使用pow函數在C負數的根,我得到nan(非數字)

double cuber; 
cuber=pow((-27.),(1./3.)); 
printf("cuber=%f\n",cuber); 

輸出:cuber=nan

有什麼方法可以計算C中負數的立方根?

回答

19

7.12.7.1的cbrt功能

梗概

#include <math.h> 
double cbrt(double x); 
float cbrtf(float x); 
long double cbrtl(long double x); 

說明

cbrt的函數計算的x真正立方根。


如果你很好奇,pow不能用於計算立方根,因爲有三分之一是不表達作爲一個浮點數。你實際上要求pow-27.0提高到接近1/3的合理功率;沒有真正的結果是合適的。

+0

`pow`可以用來計算正數的立方根。 – 2011-12-13 17:08:24

+3

@SteveJessop:`pow`可用於計算正數的「0.333333333333333314829616256247390992939472198486328125」次冪,它通常(但不總是)與四捨五入後的立方根相同。 – 2011-12-13 17:09:29

6

有。請記住:x ^(1/3)= - ( - x)^(1/3)。所以下面應該這樣做:

double cubeRoot(double d) { 
    if (d < 0.0) { 
    return -cubeRoot(-d); 
    } 
    else { 
    return pow(d,1.0/3.0); 
    } 
} 

寫沒有編譯,所以可能會有語法錯誤。

問候, 約斯特

0

斯蒂芬佳能回答,糾正功能在這種情況下使用的是CBRT()。如果您事先不知道指數,可以查看cpow()函數。

 

#include <stdio.h> 
#include <math.h> 
#include <complex.h> 

int main(void) 
{ 
    printf("cube root cbrt: %g\n", cbrt(-27.)); 
    printf("cube root pow: %g\n", pow(-27., 1./3.)); 
    double complex a, b, c; 
    a = -27.; 
    b = 1./3; 
    c = cpow(a, b); 
    printf("cube root cpow: (%g, %g), abs: %g\n", creal(c), cimag(c), cabs(c)); 
    return 0; 
} 
 

打印

 
cube root cbrt: -3 
cube root pow: -nan 
cube root cpow: (1.5, 2.59808), abs: 3 

牢記複雜功率的定義:CPOW(A,B)= CEXP(b *的堵塞的(a))。

0

使用牛頓法:

def cubicroot(num): 
    flag = 1 
    if num < 0: 
    flag = -1 
    num = num - num - num 
    x0 = num/2. 
    x1 = x0 - (((x0 * x0 * x0) - num)/(3. * x0 * x0)) 
    while(round(x0) != round(x1)): 
    x0 = x1 
    x1 = x0 - (((x0 * x0 * x0) - num)/(3. * x0 * x0)) 
    return x1 * flag 

print cubicroot(27)