在现实世界中,应存在负数的立方根:
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中计算负数的立方根?
答案 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)