用函数求负数的立方根

  • 本文关键字:立方根 函数 math
  • 更新时间 :
  • 英文 :


在现实世界中,负数的立方根应该存在:cuberoot(-1)=-1表示(-1)*(-1)*(-1)=-1cuberoot(-27)=-3,表示(-3)*(-3)*(-3)=-27

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

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

输出:cuber=nan

是否有办法计算C中负数的立方根?

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;没有合适的实际结果

有。记住,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);
  }
}

没有编译,所以可能有语法错误。

问候,Jost

正如Stephen Canon所回答的,在这种情况下使用的正确函数是cbrt()。如果事先不知道指数,可以查看cpow()函数。

<>之前 #include <stdio.h> #include <math.h> #include <complex.h> int main(void) { printf("cube root cbrt: %gn", cbrt(-27.)); printf("cube root pow: %gn", 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: %gn", creal(c), cimag(c), cabs(c)); return 0; } 之前

打印<>之前立方根cbrt: -3立方根pow: -nan立方根cpow: (1.5, 2.59808), abs: 3之前

记住复幂的定义:cpow(a, b) = cexp(b* clog(a))

使用牛顿法:

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)

相关内容

  • 没有找到相关文章

最新更新