192 views
--- 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)$ :::