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
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
A voir également:
- Correction fonction exponentiel
- Fonction si et - Guide
- Correction orthographe - Guide
- Fonction moyenne excel - Guide
- Telecharger clavier français avec correction - Télécharger - Divers Utilitaires
- Mode correction word - Guide
1 réponse
Utilisateur anonyme
14 juil. 2014 à 10:40
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 :
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));
Modifié par KX le 14/07/2014 à 11:35
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 : et 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 :
Devient :
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 :
Remarque : le calcul d'une puissance selon la formule est assez naïf, il y a plus efficace, notamment en considérant que .
Cependant, en terme d'optimisation, il faut surtout regarder du côté de ta boucle principale
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.
Modifié par le père. le 14/07/2014 à 12:02
Si on veut optimiser, il est préférable d'utiliser la fonction exp() de la bibliothèque math, non ?
14 juil. 2014 à 12:04
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 avec des appels aux fonctions qui ont elles mêmes des boucles, il vaudrait mieux faire directement :
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 !
14 juil. 2014 à 12:36
Mais, bon, ça ne peut pas faire de mal non plus.
18 juil. 2014 à 07:50