Skip to content
Snippets Groups Projects
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

exe^x
.

Pour cela, on utilise la définition de

exe^x
en tant que série (somme infinie) :

ex=n=0+xnn!=1+x+x22!+x33!++xnn!+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

xnx^n
ainsi que
n!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 :
ex1+x22!+x33!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

xx
. 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

xx
de votre choix) que
x0x^0
vaut
11
, que
0r0^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.