La fonction sinus à l'aide de développement de Taylor (Programmation en C)

Ici est la question..

C'est ce que j'ai fait jusqu'à présent,

#include <stdio.h>
#include <math.h>

long int factorial(int m)
{
    if (m==0 || m==1) return (1);
    else      return (m*factorial(m-1));
}
double power(double x,int n)
{
    double val=1;
    int i;
    for (i=1;i<=n;i++)
    {
        val*=x;
    }
    return val;
}

double sine(double x)
{
    int n;
    double val=0;
    for (n=0;n<8;n++)
    {
        double p = power(-1,n);
        double px = power(x,2*n+1);
        long fac = factorial(2*n+1);
        val += p * px / fac;
    }
    return val;
}

int main()
{
    double x;
    printf("Enter angles in degrees: ");
    scanf("%lf",&x);
    printf("\nValue of sine of %.2f is %.2lf\n",x,sine(x * M_PI / 180));
    printf("\nValue of sine of %.2f from library function is %.2lf\n",x,sin(x * M_PI / 180));
    return 0;
}

Le problème est que le programme fonctionne parfaitement bien de 0 à 180 degrés, mais au-delà de ce qu'elle donne à l'erreur.. Aussi quand j'augmente la valeur de n dans for (n=0;n<8;n++) au-delà de 8, j'obtiens des erreurs.. Il n'y a rien de mal avec l'algorithme, je l'ai testé dans ma calculatrice, et le programme semble être très bien.. je pense que le problème est dû à la plage du type de données.. que dois-je corriger pour se débarrasser de cette erreur?

Merci..

  • Quelle est l'erreur exactement?
  • Je ne sais pas pour vous si c'est ça, mais tu parlais de type de données plage de... Avez-vous essayé d'avoir factorial retour d'un long long int?
  • la valeur diffère de la valeur standard.. par exemple à 270 degrés-je obtenir -0.44, mais la valeur standard est de -1.
  • oui, essayé.. n'a pas aidé..
  • (Je suppose que vous voulez dire "de 0 à pi" plutôt que "de 0 à 180 degrés", parce que le développement de Taylor travaille en radians, pas de degrés). Vous avez besoin pour réduire l'ampleur de la px et fac variables. Par exemple, refactoriser l'expression de x^(2n+1)/(2n+1)! le produit(i=1 étape 2 à 2n+1){x/j'ai}. Notez également que la convergence est lente lorsque vous obtenez loin de 0.
  • Il fait la conversion en radians.