TP: Implanter la fonction exponentielle (4/5)¶
Partie 4 : Calcul de l’exponentielle avec une précision relative fixée ♣¶
Vous aviez implanté une fonction expRang
qui calcule une approximation de l’exponentielle en tronquant la somme à un certain rang décidé à l’avance. Cependant le rang nécessaire pour obtenir une bonne précision dépend du réel \(x\) pour lequel on veut calculer \(e^x\). On cherche maintenant à calculer une approximation de l’exponentielle en fixant la précision et non plus le rang. Pour cela on va écrire une nouvelle fonction d’approximation de l’exponentielle, dans laquelle le rang auquel on arrête la somme ne sera pas décidé à l’avance, mais dépendra de l’évolution du calcul qu’on est en train de faire.
Commencez par copier-coller dans les quatre cellules suivantes vos fonctions puissance
et factorielle
de la partie 1 ainsi que abs
et egal
de la partie 3:
// VOTRE CODE ICI
// VOTRE CODE ICI
// VOTRE CODE ICI
// VOTRE CODE ICI
Implantez une nouvelle fonction d’approximation de l’exponentielle qui somme les valeurs \(\frac{x^i}{i!}\) jusqu’à ce que le résultat soit égal au précédent par rapport à la précision donnée:
/** Calcul de la fonction exponentielle à precision fixée
* @param x un nombre de type double
* @param epsilon un nombre de type double
* @return e^x avec précision epsilon
**/
double expPrecision(double x, double epsilon) {
// VOTRE CODE ICI
}
double epsilon = 0.000000001
Le calcul suivant devrait renvoyer 2,718282:
expPrecision(1, epsilon)
Il n’y a pas forcément suffisament de chiffres significatifs affichés pour le vérifier. Faisons à la place un test:
CHECK( abs( expPrecision(1, epsilon) - 2.718282 ) < 1e-6 )
CHECK( abs( expPrecision(5, epsilon) - 148.413159 ) < 1e-6 )
CHECK( abs(expPrecision(3, epsilon) - 20.085537 ) < 1e-6 )
Comparez vos résultat avec la fonction exp
de C++ définie dans cmath
#include <cmath>
exp(5)
exp(3)