Correction fonction exponentiel

Résolu/Fermé
Jassarpc Messages postés 16 Date d'inscription samedi 15 février 2014 Statut Membre Dernière intervention 5 décembre 2014 - Modifié par zipe31 le 14/07/2014 à 08:35
Jassarpc Messages postés 16 Date d'inscription samedi 15 février 2014 Statut Membre Dernière intervention 5 décembre 2014 - 18 juil. 2014 à 07:50
bonjour a tous!!!!
Je demande à tous les programmeurs en c de corriger mon code ou de me donner un autre methode!!!!!!J'ai creer un fonction factoriel et apres il m renvoi toujours des nombres plu grande!!!


voici mon code :



#include <stdio.h>

int puissance(int x,int n)
{
int i,k=1;
if(x==0){k=k;}

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

{
k=k*x;
}
}
return k;
}

int factoriel(int n)
{int l=1,i;
if(n==0){l=l;}
else{
for(i=1;i<=n;i++)

{
l=l*i;
}
}
return l;
}


int main ()

{
int x=0,n=0,e=0;

int k,p,f;
printf("Entrez x=");
scanf("%d",&x);
printf("Entrez n=");
scanf("%d",&n);

float y=0;
for (k=0;k<=n;k++)
{
y=y+(puissance(x,k)/factoriel(k));
}
printf("Le resultat est %f\n",y);

/*p=puissance(x,n);
f=factoriel(n); 
printf("\n %d à la puissance %d ==>p=%d\n factoriel de %d==>f=%d\n",x,n,p,n,f);*/

}







Merci d'avance!!!!!!!!
A voir également:

1 réponse

Utilisateur anonyme
14 juil. 2014 à 10:40
Bonjour

Tes deux fonctions puissance et factoriel te rendent des int.
Donc quand tu fais la division (puissance(x,k)/factoriel(k)), tu divises deux int : le résultat est tronqué à une valeur entière, ce qui rend ton calcul faux. Il faut que tu forces la division à se faire en float en changeant le type d'au moins un des deux opérandes, soit en modifiant la définition d'une des deux fonctions, ou avec un transtypage :
y=y+((float)puissance(x,k)/factoriel(k));
1
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 14/07/2014 à 11:35
Bonjour,

Le mieux ici c'est de tout calculer directement en double, pas juste caster les int, car vu que les valeurs montent très vite (on dépasse la taille maximale d'un int pour 13!) et que le calcul qui est effectué ne nécessite pas d'avoir les valeurs exactes, on peut se permettre de perdre un peu de précision pour permettre une plus grande amplitude de valeurs.

Remarque :
if(x==0){k=k;}
et
if(n==0){l=l;}
c'est particulièrement moche !
Dans une instruction if, tu n'es pas obligé d'avoir un else. Donc si ton "then" ne fait rien, autant inverser la condition, mettre tout ton else dans ton "then" et supprimer le else.

Exemple :

if(x==0){k=k;}
else{
   for (i=1;i<=n;i++)
   {
      k=k*x;
   }
}

Devient :

if(x!=0) {
   for (i=1;i<=n;i++)
   {
      k=k*x;
   }
}

Même si dans ton cas tu peux encore faire mieux et mettre plusieurs return, un pour chaque cas, ce qui t'évites un if.

Exemple :

double puissance(double x, int n)
{
    int i;
    double k = 1;

    if (x==0)
        return 0;
    
    for (i=1; i<=n; i++)
        k *= x;

     return k;
}

Remarque : le calcul d'une puissance selon la formule
x^(n+1) = (x^n)*x
est assez naïf, il y a plus efficace, notamment en considérant que
x^(2*n) = (x^n)^2
.

Cependant, en terme d'optimisation, il faut surtout regarder du côté de ta boucle principale
y=y+(puissance(x,k)/factoriel(k));
En effet tu recommences tout le calcul de la puissance et de la factorielle à chaque fois, alors que tu pourrais les calculer au fur et à mesure dans cette boucle, ce qui serait beaucoup plus léger en nombre de calculs.
0
Tu es plus courageux que moi, KX. J'ai préféré me limiter à l'essentiel, srictement, ce qui ne marchait pas dans le code de Jassarpc.
Si on veut optimiser, il est préférable d'utiliser la fonction exp() de la bibliothèque math, non ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
14 juil. 2014 à 12:04
Evidemment on pourrait appeler la fonction exp, mais il s'agit ici de la réécrire...
Cependant, la vision de Jassarpc est très naïve, car en gros on va recalculer à chaque fois tout une partie des calculs que l'on a déjà fait.

En gros au lieu de faire
y=y+(puissance(x,k)/factoriel(k))
avec des appels aux fonctions qui ont elles mêmes des boucles, il vaudrait mieux faire directement :

y+=puissance/factoriel;
puissance*=x;
factoriel*=k;

On n'a donc plus d'imbrications de boucles, mais une seule boucle qui fait tout.
Si ça te parle, on passe d'une complexité O(n²) à O(n)... la différence est énorme !
0
Utilisateur anonyme
14 juil. 2014 à 12:36
Tout à fait d'accord avec tes considérations, à ce détail près qu'elles sortent largement du cadre de la question posée par Jassarpc. Il avait un code probablement de son crû, et qui tenait à peu près la route (ce qui est remarquable par rapport à la moyenne des posteurs !) et il se demandait d'où venait l'erreur dans son résultat, pas comment optimiser son calcul. Je ne suis pas sûr, vu la naïveté de son code, qu'il tire grand profit de tes explications, si judicieuses soient-elles.
Mais, bon, ça ne peut pas faire de mal non plus.
0
Jassarpc Messages postés 16 Date d'inscription samedi 15 février 2014 Statut Membre Dernière intervention 5 décembre 2014
18 juil. 2014 à 07:50
Grand merci a vous deux le père et KX!!!!!!!Grace à vous j ai pu corriger bon erreur et optimiser mes programmes!!!!!!!!Je pense qu'à mon prochain retour c'est pour donner aux autres des explications et aides comme vous avez faites!!!!merci bcp!!!!!
0