2011-12-13 80 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)