TP : implanter la fonction exponentielle (1/5)#
Imaginez que vous développez la nouvelle librairie de fonctions
mathématiques du C++
. Au départ, les seules opérations auxquelles
vous avez le droit sont les opérations arithmétiques usuelles telles
que +
*
/
%
. Notre but aujourd’hui est d’écrire la fonction
qui calcule \(e^x\).
Pour cela, on utilise la définition de \(e^x\) en tant que série (somme infinie) :
On remarque que l’on a besoin en particulier de calculer \(x^n\) ainsi que \(n!\). Ce sera l’objet de la première partie. Dans la deuxième partie, on calculera une approximation de la fonction exponentielle en la tronquant à un nombre de terme fixé; par exemple : \(e^x \approx 1+\frac{x^2}{2!}+\frac{x^3}{3!}\)
La précision d’une telle approximation dépend beaucoup de la valeur de \(x\). Dans la partie 4 on utilisera une méthode adaptative : on fixera cette fois la précision relative souhaitée et on calculera autant de termes que nécessaire pour atteindre cette précision. Pour cela on aura préalablement défini – et implanté ! – dans la partie 3 ce que l’on entend par précision relative.
Partie 1 : fonctions puissance et factorielle#
Le but de cette partie est d’écrire les fonctions factorielle
et
puissance
(vues en TD) et de vérifier que l’on obtient bien les
résultats attendus. Complétez la fonction factorielle
ci-dessous
puis vérifiez les résultats des cellules suivantes :
/** Factorielle
* @param n un entier
* @return la valeur n! en tant que double
**/
double factorielle(int n) {
// Remplacer cette ligne et la suivante par le code adéquat
throw runtime_error("Code non implanté");
}
factorielle(5)
CHECK( factorielle(0) == 1 ); // Par convention mathématique
CHECK( factorielle(3) == 6 );
CHECK( factorielle(4) == 24 );
CHECK( factorielle(5) == 120 );
Vérifiez l’ordre de grandeur du calcul suivant. Si la valeur est
aberrante, vérifiez l’utilisation du type double
à toutes les étapes
du calcul.
factorielle(100)
Complétez la fonction puissance
ci-dessous puis vérifiez les
résultats des cellules suivantes :
/** Puissance
* @param x un nombre de type double
* @param n un entier
* @return le nombre x^n de type double
**/
double puissance(double x, int n) {
// Remplacer cette ligne et la suivante par le code adéquat
throw runtime_error("Code non implanté");
}
puissance(2, 4)
CHECK( puissance(1, 10) == 1 );
CHECK( puissance(2, 5) == 32 );
CHECK( puissance(1.5, 3) == 3.375 );
Ajoutez des tests (toujours avec CHECK) pour vérifier les cas limites : vérifiez (pour une valeur de x de votre choix) que \(x^0\) vaut \(1\), que \(0^r\) vaut 0 pour \(r\) non nul, et que \(0^0\) vaut \(1\) :
// Remplacer cette ligne et la suivante par le code adéquat
throw runtime_error("Code non implanté");
Bilan de la partie 1#
Vous avez maintenant les prérequis pour implanter la fonction exponentielle. Vous pouvez maintenant passer à la partie 2.