Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Calculo del Seno por Taylor

Estas en el tema de Calculo del Seno por Taylor en el foro de C/C++ en Foros del Web. Estoy intentando calcular el seno de un ángulo en radianes por medio de la serie de Taylor. Lo he hecho en C y compilado con ...
  #1 (permalink)  
Antiguo 25/05/2012, 06:03
 
Fecha de Ingreso: junio-2009
Mensajes: 30
Antigüedad: 14 años, 10 meses
Puntos: 0
Calculo del Seno por Taylor

Estoy intentando calcular el seno de un ángulo en radianes por medio de la serie de Taylor. Lo he hecho en C y compilado con devc, pero me funciona en positivos en primer y segundo cuadrante (o eso creo) pero no en negativos en tercer y cuarto cuadrante. A ver si alguien me puede ayudar.

Código:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
int factorial (int);

int main()
{
    int k,n=0;
    double  x,sinx=0.0,seno;
    double  pro,den,pot;
    printf ("introduce el valor de k: ");
    scanf ("%d",&k);
    printf ("\nintroduce el valor del angulo en radianes: ");
    scanf ("%lf",&x);
    while (n<=k)
    {
           // esta es una prueba con la formula toda junta, sin casting
          //seno =((pow (-1,n))/factorial(2*n+1))*(pow(x,2*n+1));
          pot=(double) pow(-1,n);
          den=(double) factorial(2*n+1);
          pro=(double)pow(x,2*n+1);
          seno= ((double)pot/(double)den)*(double)pro;
          sinx= sinx + seno;
          printf("\nEl elemento n=%d es %lf y la suma va siendo %lf",n,seno,sinx);
          n++;
          
    }
    printf ("\nEl valor del seno es:%lf",sinx);
    getch();
}
int factorial (int a)
{
    int i,fac;
    
    fac=1;
    for (i=a;i>0;i--)
    {
        fac=fac*i;
    }
    return fac;
    //dentro de la funcion no llamar a nada igual que la funcion
}
Saludos y Gracias.
  #2 (permalink)  
Antiguo 26/05/2012, 05:45
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Calculo del Seno por Taylor

El programa, en principio, es correcto. El problema lo tienes en la función factorial. La has definido como entera, con valores enteros (32 bits) con signo el rango de que dispones es desde -2^31 a (2^31)-1, es decir, de -2,147,483,648 a +2,147,483,647 (ó 0 a (2^32)-1, 0 a 4,294,967,296 si son enteros sin signo). Al calcular factoriales, tienes 12! = 479,001,600, pero 13! = 6,227,020,800, fuera del rango de un entero de 32 bits (con o sin signo). Es decir, con la función factorial como entera, puedes llegar a 12!. En tu programa, dado que haces fact(2*n+1), esto te limita el valor de k a un máximo de 5 (2*5+1=11, pero 2*6+1=13, fuera de alcance).

Por ello, en el primer y segundo cuadrante, con valores del ángulo relativamente pequeños, no apreciarás errores importantes en el resultado aún con valores de k de 6 ó 7, pero sí que se hace patente en los otros dos cuadrantes, con valores mayores de ángulo, o con valores de k grandes (ya que en los desbordamientos de enteros se pìerden los bits más significativos, y lo que queda puede interpretarse como un número pequeño, o incluso negativo).

Soluciones:
Puedes llegar a 20! (k=9 en tu programa, para 19!) si dispones de un tipo entero de 64 bits.
Puedes llegar a 33! (k=16 en tu programa) si implementas la función como float.
Puedes llegar a 170! (k=84 en tu programa) si implementas la función como double.

Etiquetas: calculo, funcion, int
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:09.