DL sinus en C

Signaler
Messages postés
3
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
14 avril 2009
-
 amal -
Bonjour à tous,

Dans le cadre de nos cours d'info (programmation en C), on doit réaliser un programme qui calcul le sinus d'un angle.

J'ai utilisé le DL de sinus pour y parvenir. La compilation marche sans soucis mais lorsque je veux calculer le sinus de 90 avec un DL à l'ordre 10, le programme me renvoie pas de resultat:

" La valeur de sinus 90 avec un DL d'ordre 10 est: -1.#IND00"

Je vous poste mon code, j'éspère que quelqu'un pourra m'aider.

Merci d'avance

Cordialement,

YoKo

Voici le code:

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


// fonction puissance: x puissance n avec precision double.
double power(double x, double n)


{
    double y=1;
    int a=1;


    if(n==0)
    {
        return 1;
    }
    else
    {
        while (a<=n)
        {
            y=y*x;
            a++;
        }
        return y;
    }
}


// factorielle d'un nombre: precision double.


double fact(double c)


{
    int i;
    double n,fact=1;


    for(i=1,fact=1;i<c+1;i++)
    {
        fact*=i;


        return fact;
    }
}


// programme principal


int main()


{


double x,s,n;
int i;


printf("Donner la valeur de x\n");
scanf("%lf",&x);


printf("Donner l'ordre du DL\n");
scanf("%lf",&n);


s=x;


// Le DL de sinus:


for(i=1;i<=n;i++)
{
    s+=(power(-1,i))*((power(x,2*x+1))/(fact((double)2*i+1)));
}


printf("la valeur de sin %lf au DL d'ordre %lf est %lf:\n\n",x,n,s);
printf("la valeur exact de sin %lf est %lf\n\n",x,sin(x));




return 0;
}

4 réponses

Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
Bonjour,


C'est un dépassement de capacité, power(x,2*x+1) c'est 90 puissance 181 !!!


Moi je convertirai x en radians avant de faire les calculs : x = x*3.14159/180;
La fonction sin(x) demande un x en radians.


 


 
Messages postés
3
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
14 avril 2009

Je crois que j'ai fait une erreur au niveau du calcul dans ma boucle, mais je ne suis pas sur. Ce n'est pas plutôt:

// Le DL de sinus:
for(i<bold>0 ;i<</bold>n;i++)
{
    s+= (power(-1,i))*((power(x,2* i +1))/(fact((double)2*i+1)));
}


Un i plutôt que x dans le calcul du DL, étant donné que l'on veut calculer le DL tant que i< =n (ordre du DL).

Malgré cela je trouve toujours un résultat étonnant:

Ex: sinus 90 au DL 10 me donne:

Donner la valeur de x
90
Donner l'ordre du DL
10
la valeur de sin 90 au DL d'ordre 10 est 109405482281847930000000000000000000000000.000000:

la valeur exact de sin 90 est 0.893997

Voilà j'espere que quelqu'un pourra m'aider, je ne sais pas si mon code est juste ou pas....

Merci d'avance

YoKo
Messages postés
3
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
14 avril 2009

J'ai refais la même chose en convertissant le nombre en radian:

Je ne vois pas trop où est l'erreur...

Voici le code:

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


// fonction puissance: x puissance n avec precision double.
double power(double x, double n)


{
    double y=1;
    int a=1;


    if(n==0)
    {
        return 1;
    }
    else
    {
        while (a<=n)
        {
            y=y*x;
            a++;
        }
        return y;
    }
}


// factorielle d'un nombre: precision double.


double fact(double c)


{
    int i;
    double n,fact=1;


    for(i=1,fact=1;i<c+1;i++)
    {
        fact*=i;


        return fact;
    }
}


// programme principal


int main()


{


double s,x;
int i,n;


printf("Donner la valeur de x\n");
scanf("%lf",&x);


printf("Donner l'ordre du DL\n");
scanf("%d",&n);


s=x*(M_PI/180);


// Le DL de sinus:


for(i=1;i<=n;i++)


{
    s=s+(power(-1,i))*(power(x*(M_PI/180),2*i+1)/fact(2*i+1));
}


printf("la valeur de sin %lf au DL d'ordre %d est %lf:\n\n",x,n,s);
printf("la valeur exact de sin %lf est %lf\n\n",x,sin(x));
printf("La valeur de Pi est %lf\n",M_PI);




return 0;
}


Dans ce cas je trouve pour sin 90 avec ordre 10:



Donner la valeur de x
90
Donner l'ordre du DL
10
la valeur de sin 90.000000 au DL d'ordre 10 est 9349.193177:



la valeur exact de sin 90.000000 est 0.893997



La valeur de Pi est 3.141593

YoKo
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
7
Salut

Voila un prog qui marche: (les modifs sont faites en rouge)

double fact(double c)
{
    int i;
    double n,fact=1;

    for(i=1,fact=1;i<c+1;i++)
        fact*=i;
    
    return fact;
}

// programme principal
int main()
{

double s,x;
int i,n;

printf("Donner la valeur de x\n");
scanf("%lf",&x);

printf("Donner l'ordre du DL\n");
scanf("%d",&n);

x=x*(M_PI/180.0);

// Le DL de sinus:

s=0;
for(i=0;i<=n;i++)
   s=s+(pow(-1.0,(double)i))*(pow((double)x,(double)(2*i+1))/fact(2*i+1));

printf("la valeur de sin %lf au DL d'ordre %d est %lf:\n\n",x,n,s);
printf("la valeur exact de sin %lf est %lf\n\n",x,sin(x));
printf("La valeur de Pi est %lf\n",M_PI);

return 0;
}

A+
____________________________________________________________________________
Mon site internet :