---
title: VISI601_CMI (3a) Représentation des nombres réels en machine
type: slide
slideOptions:
transition: slide
progress: true
slideNumber: true
---
# Représentation des nombres réels en machine
> [name=Jacques-Olivier Lachaud][time=January 2022][color=#907bf7]
> (Les images peuvent être soumises à des droits d'auteur. Elles sont utilisées ici exclusivement dans un but pédagogique)
###### tags: `visi601`
Retour à [VISI601_CMI (Main) Algorithmique numérique](https://codimd.math.cnrs.fr/s/IWTaBkA9m)
---
## Erreurs relatives dans les méthodes numériques
Très souvent, on s'intéresse à l'**erreur relative** dans un calcul numérique
Solution réelle $x$, solution approchée $\widetilde{x}$
$E_{rel}:=\frac{\| x -\widetilde{x} \|}{\| x \|}$
==Exemple== En astronomie, une erreur d'1km peut être très faible, et est évidemment énorme en informatique embarquée.
---
## Ecriture positionnelle vs écriture à virgule flottante
**Ecriture positionnelle**: dans une base, on écrit tous les chiffres à gauche et à droite de la virgule, jusqu'à ce qu'ils soient tous nuls
==Exemple== $223.456$ ou $159000000.0$ ou $0.00000037534501$
**Ecriture à virgule flottante**: on se ramène "autour" de la virgule en décomposant le nombre en mantisse et exposant
==Exemple== $2.23456 \times 10^2$ ou $1.59 \times 10^8$ ou $3.7534501 \times 10^{-7}$
L'exposant donne l'unité d'intérêt, les chiffres de la mantisse donne la précision dans cette unité
---
## Représentation machine des nombres à virgule flottante
Il s'agit d'un codage binaire du signe, de la mantisse et de l'exposant
| Types | Signe | Exp. | Mant. | Valeur | Chiffres déc. significatifs |
| ------------ | ----- | ---- | ----- | -------------------------------------- | --- |
| simple (32b) | 1 bit | 8 b | 23b | $(-1)^S \times 1.M \times 10^{E-127}$ | 24b, soit $\approx 7$ |
| double (64b) | 1 bit | 11 b | 52b | $(-1)^S \times 1.M \times 10^{E-1023}$ | 53b, soit $\approx 16$ |
Comme c'est des nombres binaires, le premier chiffre est toujours 1 (non codé). On a des codages spéciaux de +0 et -0, de $+\infty$ et $-\infty$ et des erreurs NaN (not a number).
---
## Un exemple
$x = -47.625$ en flottant 32 bits. Le signe $\color{green}S$ sera $\color{green}1$ (négatif), puis:
$\begin{align*}47.625 &= 32 + 8 + 4 + 2 + 1 + 0.5 + 0.125\\ &= 2^5 + 2^3 + 2^2 + 2^1 + 2^0 + 2^{-1} + 2^{-3}\\ &=_2 101111,101 && \text{(en base 2)} \end{align*}$
On l'exprime sous la forme $1.xyz\ldots \times 2^n$
$101111,101 = 1,01111101 \times 2^5$
La mantisse $\color{red}M$ sera $\color{red}{011111010\cdots 0}$ sur 23bits.
L'exposant 0 est codé $e=127=2^7-1$.
Donc l'exposant $\color{blue}E=n+e=5+127=132=_2 \color{blue}{10000100}$.
En machine, $x =\color{green}{1}\color{blue}{10000100}\color{red}{011111010\cdots 0}$
---
## Erreurs d'arrondis numériques
Soit $fl(x)$ la fonction qui arrondit un réel au nombre flottant le plus proche.
alors son erreur **relative** $E_{rel} = \frac{|x-fl(x)|}{|x|} \le 2^{1-t}$, avec $t$ nb de bits de la mantisse
:::danger
On note $\frak{u}:=2^{1-t}$, appelé **précision machine** ou *unité d'arrondi*
:::
Les opérations numériques arithmétiques $\oplus,\ominus,\otimes,\oslash$ introduisent des erreurs
$\widetilde{x} \oplus \widetilde{y} = (\widetilde{x} + \widetilde{y})(1+r)$, avec $|r| \le \frak{u}$
$\widetilde{x} \otimes \widetilde{y} = (\widetilde{x} \times \widetilde{y})(1+r')$, avec $|r'| \le \frak{u}$
$\ldots$
Leur erreur relative est $E_{rel}(\oplus)=\frac{\left|(\widetilde{x} + \widetilde{y}) - (\widetilde{x} + \widetilde{y})(1+r)\right|}{\left|(\widetilde{x} + \widetilde{y})\right|}=|r| \le \frak{u}$
---
==Exemple== Approximation de $f(x,y)=x + y$ par $\widetilde{f}(x,y)=fl(x)\oplus fl(y)$
$\widetilde{f}(x,y)=fl(x) \oplus fl(y)=\left((x(1+\epsilon_1)) + (y(1+\epsilon_2))\right)(1+\epsilon_3)$
$=(x + y)(1+\epsilon_3)+(x\epsilon_1\epsilon_3)+(y\epsilon_2\epsilon_3)$, avec $|\epsilon_i| \le \frak{u}$
$$
E_{rel}(\widetilde{f}) \le |\epsilon_3|+\frac{|x\epsilon_1\epsilon_3|}{|x+y|}+\frac{|y\epsilon_2\epsilon_3|}{|x+y|} \le 3 \frak{u}
$$
si ${\frak{u}} \le |1+x/y|$ et ${\frak{u}} \le |1+y/x|$, i.e. problèmes lorsque $x\approx -y$
:::warning
L'erreur relative est grande là où le conditionnement est grand.
$K_{rel}(f(\mathbf{d}))=\| f'(\mathbf{d}) \| \frac{\|\mathbf{d}\|}{\|f(\mathbf{d})\|}=\left\| \begin{bmatrix}1\\ 1\end{bmatrix} \right\| \frac{\left\| \begin{bmatrix}x\\ y\end{bmatrix} \right\|}{|x+y|}=\sqrt{2}\frac{\sqrt{x^2+y^2}}{|x+y|}$, avec $\mathbf{d}=(x,y)$
:::