Hola buenas, estoy tratando de calcular el seno de un ángulo medido en radianes a partir del polinomio de Taylor, y una vez conocido este, calcular el coseno del ángulo con la fórmula sen^2 x + cos^2 x = 1.
Tengo un código bastante aproximado, me está fallando en algo y no consigo saber en que. Me compila sin errores pero no me devuelve los resultados correctos. Intento cambiar cosas pero nada, me arroja desde 0 a direcciones de memoria, espero que alguien pueda decirme en que estoy fallando.
Gracias :)
Código c:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415926
#define UMBRAL 10e-6
/* ---------- Declaración de los prototipos de las funciones ---------- */
double calcula_term_N (const double t_ant, const double x, const int n);
void seno(double angulo, double *res);
void coseno (const double angulo, double *res);
int main(void) {
/* ---------- Declaración de variables ---------- */
double angulo; /* Ángulo introducido por teclado */
double res; /* Resultado de la función seno */
double res_seno;
double res_coseno;
/* ------------ Programa principal ------------- */
printf("\n\n ** Calculadora de funciones trigonometricas **"); printf("\n Aproximacion de la serie de McLaurin");
printf("\n\n\nIntroduzca el valor del angulo en radianes: "); while ( angulo > PI || angulo < -PI)
{
printf("\n\nIntroduzca el valor del angulo en radianes: "); }
printf("\n - Angulo introducido: %f", angulo
);
/* Llamada a la función seno(); */
seno(angulo, &res);
printf("\n - Seno de %f : %f", angulo
, res
);
/* Llamada a la función coseno(); */
coseno(angulo, &res);
printf("\n - Coseno de %f: %f", angulo
, res
);
return 0;
}
/* ---------- Definición de funciones ---------- */
/* Calcula un término de la serie de McLaurin para la función seno */
double calcula_term_N (const double t_ant, const double x, const int n)
{
int termN;
termN
= ( (-1)*(t_ant
)*(pow(x
,2)) ) / ( 2*n
*( (2*n
) + 1) );
return termN;
}
/* Calcula el valor del seno del ángulo medido en radianes usando la función calcula_Term_N
para calcular cada término de la serie de McLaurin */
void seno(double angulo, double *res)
{
int t_actual; /* Almacena el valor del primer término */
int term; /* Término en el que se encuentra el bucle */
int t_ant; /* Término anterior al termino actual */
term=0; /* Se inicializa a 0 porque es el primer término */
*res=0; /* Al principio el resultado es 0 */
t_actual = angulo; /* Para la función seno, el valor del primer término coincide con el valor del ángulo */
/* Mientras el valor absoluto del término que se va a calcular sea menor que el UMBRAL, el bucle sigue ejecutándose */
while ( abs(t_actual
) > UMBRAL
) {
/* Se contabiliza el término actual y se guarda en *res */
*res = *res + t_actual;
term++;
/* El término anterior pasa a ser el término actual */
t_ant=t_actual;
t_actual = calcula_term_N(t_ant, angulo, term);
}
}
/* Calcula el valor del coseno de un ángulo medido en radianes usando la función seno, a partir de la fórmula sen^2 x + cos^2 x = 1 */
void coseno (const double angulo, double *res)
{
if ( angulo < (PI/2) )
{
*res = -*res;
}
}