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