Factoriel et cosinus

Endrew Messages postés 8 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 9 juin 2009 - 29 oct. 2007 à 12:19
Endrew Messages postés 8 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 9 juin 2009 - 5 nov. 2007 à 21:41
bonjours à tous,
Depuis plusieurs jours, je tente de régler un problème sans succés,
J'essai d'utiliser la série de taylor en C
j'ai donc crée 2 sous prog,
l'un faisant la factoriel, et l'autre le calcul du cos avec la serie de Taylor
je vous expose mon prog:
                                                            // Factoriel
double factoriel(double n)
{
double i=0;
double B=1;
double m;
m=n;
while(m>=1)
 {    
   i=i+1;
   B=B*i;
      m=m-1;
   }
return B;
}
                                                   //Cosinus
double cosinus(double x, double E)
{
double c=0;
int n=1;
while( E<abs(( pow(-1,n))*(pow(x,(2*n)))/factoriel(2*n)))
   {
    //n=n+1;
   c=c+(( pow(-1,n))*(pow(x,(2*n)))/factoriel(2*n));
   n=n+1;
   }
return c;
}


int main(void)
    {
 double a=0.0;
 double E=0.0;
 double x=0.0;
 printf("Saisissez votre valeur, je vais calculer le cosinus!\nsaisissez un nombre:");
 scanf("%lf",&a);
 printf("saisissez une precision Epsilon: ");
 scanf("%lf",&E);
 getchar();
 printf("\nle factoriel de votre valeur est: %f",factoriel(a));
 printf("\nle cosinus de votre valeur est:%f",cosinus(a,E));
 x=cos(a);
 printf("\nle cosinus de %f est %f",a,x);
 getchar();
    }

A la fin de mon prog j'utilise la fonction Cos de la bibliothèque math.h
J'obtien bien un resultat, mais il ne corespond pas du tout à mes atentes,
si quelqu'un pouvait y jeter un petit coup d'oeil et me dire s'il trouve des erreurs
sa serai sympas,

14 réponses

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
29 oct. 2007 à 13:16
Salut
Tu y es presque...
le DL du cos est 1+(-1)^n.........

Toi tu as juste oublié le 1.
Met: double c = 1 ; et ca marche.
Par la meme occasion met n en double: problème de cast dans la fonction pow.
A+
0
Endrew Messages postés 8 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 9 juin 2009
29 oct. 2007 à 18:57
je te remercie pour la rapiditée de ta réponse,
voila ce que je comprends:
}
                                                   //Cosinus
double cosinus(double x, double E)
{
double c=1;
int n=1;
while( E<abs(( pow(-1,n))*(pow(x,(2*n)))/factoriel(2*n)))
   {
    //n=n+1;
   c=1+(( pow(-1,n))*(pow(x,(2*n)))/factoriel(2*n));
   n=n+1;
   }
return c;
}

Mais tu pourrais être plus précis pour le cast du pow
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
29 oct. 2007 à 20:19
En fait remplace pow(-1,n) par (double)(1-2*(n&0x1)), c'est un peu plus rapide.
0
Endrew Messages postés 8 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 9 juin 2009
29 oct. 2007 à 22:31
mh, j'utilise devc++, lorsque je compile il me dit qu'il ne connait pas l'opérateur &,
mais c'est surement moi qui est fait une erreur, je n'est pas encore vu la methode que tu propose juju12, mais merci de ton aide
est-ce que le code que j'ai corrigé  selon Pistol_Pete est correct?
Car le résultat du cosinus avec la méthode Taylor est complétement faux...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
30 oct. 2007 à 08:17
Salut

Non il ne faut pas que tu changes ta fonction de Taloy, c'est bien c= c+....
Mais il faut juste que tu initialises ta fonction à  1:

#include <stdio.h>
#include <math.h>
double factoriel(double n)
{
double i=0;
double B=1;
double m;
m=n;
while(m>=1)
 {   
   i=i+1;
   B=B*i;
      m=m-1;
   }
return B;
}
                                                   //Cosinus
double cosinus(double x, double E)
{
double c=1,n=1;

while( E<abs(( pow(-1,n))*(pow(x,(2*n)))/factoriel(2*n)))
   {
    //n =n+1;
   c=c+(( pow(-1,n))*(pow(x,(2*n)))/factoriel(2*n));
   n=n+1;
   }
return c;
}

donne bien pour a=20 :
cos(a) = 0.4080
et DL(cos(a))=0.0479
Ca marche impec non?
 
0
Endrew Messages postés 8 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 9 juin 2009
30 oct. 2007 à 13:57
Non pas du tout,
pour a=20 et E=0.001
cos(a)=0.4080
pour dl(cos(a))=-0.081271
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
30 oct. 2007 à 15:10
Ben alors ca c'est très fort!
Reprend le code que tu as mis dans ton premier post et corrige la ligne que j'ai mis en gras. Chez moi ca marche et je n'es rien changé d'autre.

Tien moi au courant. A+
0
Endrew Messages postés 8 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 9 juin 2009
30 oct. 2007 à 20:24
olalaa
je comprend plus rien, plus moyen de compiler...
Le message d'erreur suivant s'affiche lors de la compilation,
 `abs' undeclared (first use this function)
Tu utilise quoi comme logiciel Pistol Pete?
0
Endrew Messages postés 8 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 9 juin 2009
30 oct. 2007 à 20:29
Bon mon probleme avec  `abs' undeclared (first use this function) est réglé, mais ça ne fonctionne tj pas...
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
30 oct. 2007 à 22:37
Je compile avec Visual c++ 2005
Et toi c'est quoi ton compilateur?
Sinon je ne vois pas pourquoi ca ne marche pas chez toi. Il va falloir dérouler les opérations étape par étape.
Demain je te donnerai tous les résultats intermédiaires que j'obtiens, on pourra ainsi visualiser l'erreur.
A+
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
31 oct. 2007 à 10:59
#include <math.h>
#include <stdio.h>

double factoriel(double n)
{
    double i=0;
    double B=1;
    double m;
    m=n;
    while(m>=1)
    {    
        i=i+1;
        B=B*i;
        m=m-1;
    }
    return B;
}
//Cosinus
double cosinus(double x, double E)
{
    double c=1,n=1,tmp1,tmp2,tmp3;

    while( Ej'ai pris a=10
Je pense que le problem vient des très grand nombre générer par les factoriels et les puissance.
Essaie de prendre un E plus faible: E=0.1 pour commencer

Tu compile avec quoi?
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
1 nov. 2007 à 10:54
heu... pow(-1,n) ... c'est pas correct, faut eviter d'appeller pow avec des valeurs negatives
pour le premier argument, la solution du debut etait tres bonne : (1-2*(n&1))
ou on peut proposer aussi (n&1? -1 : +1)

une petite question : a quoi ca sert de vouloir refaire sa propre fonction cosinus si tu utilises
en fin de compte la fonction pow ...

Pourquoi faire simple quand on peut faire compliqué ?
0
Endrew Messages postés 8 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 9 juin 2009
4 nov. 2007 à 22:08
Merci pour toutes ces reponses et desoler pour le manque des miennes,
Demain j'essairai je reessairai avec visual c++, et je te dirai se que j'obtiens
0
Endrew Messages postés 8 Date d'inscription lundi 29 octobre 2007 Statut Membre Dernière intervention 9 juin 2009
5 nov. 2007 à 21:41
aaaaah super ça fonctionne!!!
Un grand merci à tous!!
0
Rejoignez-nous