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

在现实世界中,应该存在负数的立方根: 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=%f\n",cuber); 

输出: cuber=nan

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

7.12.7.1 cbrt函数

概要

 #include  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); } } 

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

问候,约斯特

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

#include  #include  #include  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; }
#include  #include  #include  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 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)