Подтвердить что ты не робот

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?

4b9b3361

Ответ 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)