2011-12-13 25 views
12

En raíz cúbica mundo real por un número negativo debe existir: cuberoot(-1)=-1, eso significa (-1)*(-1)*(-1)=-1 o cuberoot(-27)=-3, eso significa (-3)*(-3)*(-3)=-27C - encontrar la raíz cúbica de un número negativo con la función pow

Pero cuando calculo del cubo raíz de un número negativo en C usando la función pow, consigo nan (no un número)

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

de salida: cuber=nan

¿Hay alguna manera de calcular la raíz cúbica de un número negativo en C?

Respuesta

19

7.12.7.1 Las funciones cbrt

Sinopsis

#include <math.h> 
double cbrt(double x); 
float cbrtf(float x); 
long double cbrtl(long double x); 

Descripción

Las funciones cbrt calcular la verdadera raíz cúbica de x.


Si tienes curiosidad, pow no se puede utilizar para calcular raíces cúbicas, porque un tercio no es expresable como un número de coma flotante. De hecho, está pidiendo pow para aumentar -27.0 a una potencia racional muy similar a 1/3; no hay un resultado real que sea apropiado.

+0

'pow' se puede utilizar para calcular raíces cúbicas de números positivos. –

+3

@SteveJessop: 'pow' se puede usar para calcular la potencia '0.333333333333333314829616256247390992939472198486328125'th de un número positivo, que a menudo (pero no siempre) es igual a la raíz del cubo después del redondeo. –

+0

Es lo más parecido que el estándar C garantiza que 'cbrt' sea (lo cual no es ninguna garantía). IEEE 754 podría tener algo más que decir, sin embargo, si garantiza la precisión de 'cbrt'. –

6

there is. Recuerde: x^(1/3) = - (- x)^(1/3). Entonces lo siguiente debería hacerlo:

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

Escrito sin compilación, por lo que puede haber errores de sintaxis.

Saludos, Jost

0

Como respondió Stephen Canon, para corregir la función a usar en este caso es cbrt(). Si no conoce el exponente de antemano, puede examinar la función 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; 
} 
 

impresiones

 
cube root cbrt: -3 
cube root pow: -nan 
cube root cpow: (1.5, 2.59808), abs: 3 

tener en cuenta la definición de la potencia compleja: CPOW (a, b) = Cexp (b * estorbo (a)).

0

Usando el método 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) 
+0

él está usando python – dns

Cuestiones relacionadas