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)