Skip to content
Snippets Groups Projects
Verified Commit 9fbada0a authored by orestis.malaspin's avatar orestis.malaspin
Browse files

fin choses à dire sur floating points

parent 19c8733f
No related branches found
No related tags found
No related merge requests found
......@@ -206,7 +206,7 @@ Que donne la multiplication de `1101` avec `0110`?
. . .
* Décalade de $N$ bits vers la gauche!
* Décalage de $N$ bits vers la gauche!
# Entiers signés (1/2)
......@@ -534,7 +534,7 @@ $$
* Plus petite mantisse et exposant: $\sim 2^{-52}\cdot 2^{-1022}\sim 4\cdot 10^{-324}$,
* Plus grande mantisse et exposant: $\sim 2\cdot 2^{1023}\sim \cdot 1.8\cdot 10^{308}$.
# Précision finie
# Précision finie (1/3)
## Erreur de représentation
......@@ -554,7 +554,6 @@ d'arrondi**.
## Et quand on calcule?
* Avec deux chiffres significatifs
\begin{align}
&8.9+(0.02+0.04)=8.96=9.0,\\
&(8.9+0.02)+0.04=8.9+0.04=8.9.
......@@ -564,9 +563,79 @@ d'arrondi**.
## Même pas associatif!
# Erreurs d'arrondi
# Précision finie (2/3)
## Erreur de représentation virgule flottante
$$
(1.2)_{10} = 1.\overline{0011}\cdot 2^0\Rightarrow 0\ 01111111\
00110011001100110011010.
$$
Erreur d'arrondi dans les deux derniers bits et tout ceux qui viennent
ensuite
$$
\varepsilon_2 = (00000000000000000000011)_2.
$$
Ou en décimal
$$
\varepsilon_{10} = 4.76837158203125\cdot 10^{-8}.
$$
# Précision finie (3/3)
## Comment définir l'égalité de 2 nombres à virgule flottante?
. . .
Ou en d'autres termes, pour quel $\varepsilon>0$ on a
$$
1+\varepsilon = 1,
$$
pour un nombre à virgule flottante?
. . .
Pour un `float` (32 bits) la différence est à
$$
2^{-23}=1.19\cdot 10^{-7},
$$
Soit la précision de la mantisse.
## Comment le mesurer (par groupe)?
. . .
```C
float eps = 1.0;
while ((float)1.0 + (float)0.5 * eps != (float)1.0) {
eps = (float)0.5 * eps;
}
printf("eps = %g\n", eps);
```
# Erreurs d'arrondi (1/N)
Et jusqu'ici on a encore pas fait d'arithmétique!
## Multiplication avec deux chiffres significatifs, décimal
$$
(1.1)_{10}\cdot (1.1)_{10}=(1.21)_{10}=(1.2)_{10}.
$$
En continuant ce petit jeu:
$$
\underbrace{1.1\cdot 1.1\cdots 1.1}_{\mbox{10 fois}}=2.0.
$$
Alors qu'en réalité
$$
1.1^{10}=2.5937...
$$
Soit une erreur de près de 1/5e!
. . .
Le même phénomène se produit (à plus petite échelle) avec les `float` ou
`double`.
<!-- # TODO --
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment