DL sinus en C

YoKoM3n Messages postés 3 Date d'inscription samedi 21 mars 2009 Statut Membre Dernière intervention 14 avril 2009 - Modifié le 13 janv. 2022 à 20:50
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 - 14 avril 2009 à 13:36
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;
}
A voir également:

4 réponses

ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
14 avril 2009 à 09:32
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.


 


 
0
YoKoM3n Messages postés 3 Date d'inscription samedi 21 mars 2009 Statut Membre Dernière intervention 14 avril 2009
Modifié le 13 janv. 2022 à 20:50
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
0
YoKoM3n Messages postés 3 Date d'inscription samedi 21 mars 2009 Statut Membre Dernière intervention 14 avril 2009
Modifié le 13 janv. 2022 à 20:51
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
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
Modifié le 13 janv. 2022 à 20:51
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 :  
0
Rejoignez-nous