C - обнаружение кубического корня отрицательного числа с функцией pow
В реальном мире должен существовать кубический корень для отрицательного числа:
cuberoot(-1)=-1
, это означает (-1)*(-1)*(-1)=-1
или
cuberoot(-27)=-3
, что означает (-3)*(-3)*(-3)=-27
Но когда я вычисляю корень куба отрицательного числа в C с помощью функции pow
, я получаю nan
(а не число)
double cuber;
cuber=pow((-27.),(1./3.));
printf("cuber=%f\n",cuber);
вывод: cuber=nan
Есть ли способ вычислить корень куба отрицательного числа в C?
Ответы
Ответ 1
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; нет реального результата, который был бы уместным.
Ответ 2
есть. Помните: 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
Ответ 3
Как сказал Стивен Канон, для исправления функции для использования в этом случае является 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)).
Ответ 4
Использование метода Ньютона:
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)