Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
---
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": "fc78fbcc6c6f5f0b33ef0083fdca373a", "grade": false, "grade_id": "cell-a5a96caf0e3314b2", "locked": true, "schema_version": 3, "solution": false}}
# TP : implanter la fonction exponentielle (5/5)
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "c9514403258c211d52d0811f03e530f6", "grade": false, "grade_id": "cell-bc097d26c9102dde", "locked": true, "schema_version": 3, "solution": false}}
## Partie 5 : optimisation ♣
Dans notre cas, il n'est pas très efficace de réutiliser les fonctions
`puissance` et `factorielle` : on refait en effet certains calculs de
nombreuses fois! En effet, tel que nous avons écrit notre fonction
exponentielle, pour calculer $x^{r+1}$ on reprend le calcul du début
(nouvel appel à la fonction puissance) sans utiliser le fait qu'on a
déjà calculé $x^r$ et que $x^{r+1} = x^r \times x$ (et de même pour le
calcul de la factorielle qui est repris du début à chaque appel à la
fonction factorielle alors que $(r+1)! = r! \times (r+1)$).
Pour éviter ces recalculs, nous allons maintenant définir une nouvelle
version plus efficace de la fonction exponentielle qui ne fait pas
appel aux fonctions puissance ou factorielle.
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "14330926881dfa9906fb9a0509a6e304", "grade": false, "grade_id": "cell-6d56e4530ad5eb9d", "locked": true, "schema_version": 3, "solution": false}}
:::{admonition} Exercice 1
1. Copiez-collez ici les fonctions `abs` et `egal` de la
[partie 3](02-exponentielle3.md) :
:::
```{code-cell}
---
deletable: false
nbgrader:
cell_type: code
checksum: ac0b78b2f956da68c7faa5a86096939f
grade: false
grade_id: cell-11c71a2c606e0da6
locked: false
schema_version: 3
solution: true
---
// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
```
```{code-cell}
---
deletable: false
nbgrader:
cell_type: code
checksum: 44ec7a6d5779db1d614df76b5f8ee470
grade: false
grade_id: cell-f8b3f1f99b27afb6
locked: false
schema_version: 3
solution: true
---
// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
```
:::{admonition} Exercice 1 (suite)
2. Complétez la fonction ci-dessous qui calcule l'exponentielle à
précision donnée **sans** utiliser de fonction annexe (sauf
`egal`), et en procédant de façon plus efficace. Pour cela, vous
aurez besoin de trois variables d'accumulation : celle de la
puissance, celle de la factorielle et celle de l'exponentielle.
:::
```{code-cell}
---
deletable: false
nbgrader:
cell_type: code
checksum: 907876225de15ea527d95b4db2f0ab72
grade: false
grade_id: cell-303a8716a80dcc32
locked: false
schema_version: 3
solution: true
---
/** Calcul rapide de la fonction exponentielle à précision donnée
* @param x un nombre de type double
* @param epsilon un nombre de type double
* @return e^x avec précision epsilon
**/
double expRapide(double x, double epsilon) {
// REMPLACEZ CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
throw std::runtime_error("À faire");
}
```
```{code-cell}
---
deletable: false
editable: false
nbgrader:
cell_type: code
checksum: 8d0201184bba0f21e1cc937519951ef5
grade: false
grade_id: cell-c96d4c17c02ce941
locked: true
schema_version: 3
solution: false
---
expRapide(5, 0.000000001) // 148.413159
```
```{code-cell}
---
deletable: false
editable: false
nbgrader:
cell_type: code
checksum: e544e90d711df8993da0ea869a5fbdbb
grade: false
grade_id: cell-733b09f1d02a12cf
locked: true
schema_version: 3
solution: false
---
expRapide(3, 0.000000001) // 20.085537
```
```{code-cell}
---
deletable: false
editable: false
nbgrader:
cell_type: code
checksum: ee6fce39ac451bf744049ea8b586429b
grade: false
grade_id: cell-54872c873b619fe1
locked: true
schema_version: 3
solution: false
---
expRapide(1, 0.000000001) // 2.718282
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "d5946bf20f94f5987f3c8899ada6e0f1", "grade": false, "grade_id": "cell-765bea92acc94ff3", "locked": true, "schema_version": 3, "solution": false}}
:::{admonition} Exercice 1 (suite)
3. Évaluez la performance de la fonction `expRapide` en utilisant à
nouveau `timeit`. Est-ce vraiment plus rapide?
:::
```{code-cell}
%timeit expRapide(10, 0.00000001);
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "1a57be5a1f128cccfa27b6c566981aa1", "grade": false, "grade_id": "cell-54073acf05987882", "locked": true, "schema_version": 3, "solution": false}}
## Bilan
Vous avez maintenant une implantation nettement plus rapide de la
fonction exponentielle. Faut-il pour autant toujours tout réimplanter
plutôt que de réutiliser ? Non, surtout pas :
> «Early optimisation is the root of all evil»
>
> -- Donald Knuth
Ici, on pourrait par exemple obtenir les mêmes performances sans
duplication de code par *mémoïsation* (conserver les valeurs déjà
calculées de $n!$ et $x^n$ pour éviter de les recalculer). En général,
c'est à traiter au cas par cas, en tenant compte du compromis entre
temps de dévelopement et performances requises, des questions de
complexité (cf cours à venir), etc.
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "f3313388c3a778384dc9d70cd75033d4", "grade": false, "grade_id": "cell-c367cfa1df22e874", "locked": true, "schema_version": 3, "solution": false}}
Vous pouvez maintenant passer à la [suite du TP](index.md).