-
Nicolas M. Thiéry authoredNicolas M. Thiéry authored
jupytext:
text_representation:
extension: .md
format_name: myst
format_version: 0.13
kernelspec:
display_name: C++17
language: C++17
name: xcpp17
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "9a108efaad4f71c09addc6250d7a8305", "grade": false, "grade_id": "cell-a1cea05ac1387514", "locked": true, "schema_version": 3, "solution": false}}
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) :
e^x = \sum_{n=0}^{+\infty} \frac{x^n}{n!} = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} +\cdots+\frac{x^n}{n!}+\cdots
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "6c6c8ab41c51f5607faaafd857363aa3", "grade": false, "grade_id": "cell-670b85df3798f432", "locked": true, "schema_version": 3, "solution": false}}
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 fixé de termes; par exemple : e^x \simeq 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 absolue, puis relative.
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "5687d16fdbe6452ac56a1f2d1089eaf5", "grade": false, "grade_id": "cell-8ce9f4aa74ff1ade", "locked": true, "schema_version": 3, "solution": false}}
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 :
---
deletable: false
nbgrader:
cell_type: code
checksum: fc68b6e74cc8c5f772e186087173fc5e
grade: false
grade_id: cell-26599ba8b0db5d2c
locked: false
schema_version: 3
solution: true
---
/** Factorielle
* @param n un entier positif ou nul
* @return la valeur n! en tant que double
**/
double factorielle(int n) {
// REMPLACEZ CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
throw std::runtime_error("À faire");
}
factorielle(5)
---
deletable: false
editable: false
nbgrader:
cell_type: code
checksum: 77b5b29ad8316807bdc9188ac65ef447
grade: true
grade_id: cell-b141e2a8fe5b4d49
locked: true
points: 1
schema_version: 3
solution: false
---
CHECK( factorielle(0) == 1 ); // Par convention mathématique
CHECK( factorielle(3) == 6 );
CHECK( factorielle(4) == 24 );
CHECK( factorielle(5) == 120 );
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "b59162ad5f5799af04bb59d5b434e7fc", "grade": false, "grade_id": "cell-4034b50f9054165a", "locked": true, "schema_version": 3, "solution": false}}
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.
---
deletable: false
editable: false
nbgrader:
cell_type: code
checksum: 5baea162ffe9ed953e12e730886f2cce
grade: false
grade_id: cell-248a410c27f82b9c
locked: true
schema_version: 3
solution: false
---
factorielle(100)
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "8eccb9ea0f3568cf4deebb4faadf2c7d", "grade": false, "grade_id": "cell-1a440314756d1d38", "locked": true, "schema_version": 3, "solution": false}}
Complétez la fonction puissance
ci-dessous puis vérifiez les
résultats des cellules suivantes :
---
deletable: false
nbgrader:
cell_type: code
checksum: 041ab7e561619fc9978bd007897c3b14
grade: false
grade_id: cell-98509d177b22e222
locked: false
schema_version: 3
solution: true
---
/** Puissance
* @param x un nombre de type double
* @param n un entier positif ou nul
* @return le nombre x^n de type double
**/
double puissance(double x, int n) {
// REMPLACEZ CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
throw std::runtime_error("À faire");
}
puissance(2, 4)
---
deletable: false
editable: false
nbgrader:
cell_type: code
checksum: 5649e332a8cfaca594c48b6062cc74f6
grade: true
grade_id: cell-0c4baef17dc81ab9
locked: true
points: 1
schema_version: 3
solution: false
---
CHECK( puissance(1, 10) == 1 );
CHECK( puissance(2, 5) == 32 );
CHECK( puissance(1.5, 3) == 3.375 );
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "cfa29c534b225e97d8adac637fe4c097", "grade": false, "grade_id": "cell-471123af8e648bfb", "locked": true, "schema_version": 3, "solution": false}}
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 :
---
deletable: false
nbgrader:
cell_type: code
checksum: f2aad9048fc906c917dda37dfa595dbc
grade: false
grade_id: cell-a852e5dd3d8aeab1
locked: false
schema_version: 3
solution: true
---
// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "84b6e4ae3f85fd830f0cca98d917902d", "grade": false, "grade_id": "cell-b9ac4bd82bc4f381", "locked": true, "schema_version": 3, "solution": false}}
Bilan de la partie 1
Vous avez maintenant les prérequis pour implanter la fonction exponentielle. Vous pouvez maintenant passer à la partie 2.