C – recherche la racine cubique d’un nombre négatif avec fonction pow

Dans le monde réel, il devrait exister une racine cubique pour un nombre négatif: cuberoot(-1)=-1 , cela signifie (-1)*(-1)*(-1)=-1 ou cuberoot(-27)=-3 , cela signifie que (-3)*(-3)*(-3)=-27

Mais quand je calcule la racine cubique d’un nombre négatif en C en utilisant la fonction pow , je reçois nan (pas un nombre)

 double cuber; cuber=pow((-27.),(1./3.)); printf("cuber=%f\n",cuber); 

sortie: cuber=nan

Est-il possible de calculer la racine cubique d’un nombre négatif en C?

7.12.7.1 Les fonctions cbrt

Synopsis

 #include  double cbrt(double x); float cbrtf(float x); long double cbrtl(long double x); 

La description

Les fonctions cbrt calculent la racine réelle du cube de x .


Si vous êtes curieux, pow ne peut pas être utilisé pour calculer les racines de cube, car un tiers ne peut pas être exprimé sous forme de nombre à virgule flottante. Vous demandez en fait à pow d’élever -27.0 à un pouvoir rationnel presque égal à 1/3; il n’y a pas de résultat réel qui serait approprié.

il y a. Rappelez-vous: x ^ (1/3) = – (- x) ^ (1/3). Donc ce qui suit devrait le faire:

 double cubeRoot(double d) { if (d < 0.0) { return -cubeRoot(-d); } else { return pow(d,1.0/3.0); } } 

Ecrit sans compilation, il peut donc y avoir des erreurs de syntaxe.

Salutations, Jost

Comme Stephen Canon a répondu, cbrt () est nécessaire pour corriger la fonction à utiliser dans ce cas. Si vous ne connaissez pas l’exposant auparavant, vous pouvez regarder dans la fonction 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; } 

empreintes

 racine de cube cbrt: -3
 cube racine pow: -nan
 racine cubique cpow: (1.5, 2.59808), abs: 3

Gardez à l’esprit la définition du pouvoir complexe: cpow (a, b) = cexp (b * clog (a)).

En utilisant la méthode de Newton:

 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)