C - 使用pow函数查找负数的立方根

时间:2011-12-13 16:55:27

标签: c math

在现实世界中,应存在负数的立方根: cuberoot(-1)=-1,这意味着(-1)*(-1)*(-1)=-1 要么 cuberoot(-27)=-3,表示(-3)*(-3)*(-3)=-27

但是当我使用pow函数计算C中负数的立方根时,我得到nan(不是数字)

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

输出:cuber=nan

有没有办法在C中计算负数的立方根?

4 个答案:

答案 0 :(得分: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的理性力量;没有合适的实际结果。

答案 1 :(得分: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);
  }
}

编写时没有编译,因此可能存在语法错误。

问候, 斯特

答案 2 :(得分:0)

正如Stephen Canon回答的那样,在这种情况下纠正使用的功能是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 * clog(a))。

答案 3 :(得分: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)