Codage et représentation en machine des réels

Chapitre 2

L'arithmétique

L'un des plus gros défi dans le domaine de la communication homme machine est la mise en forme des données en vue de les faire comprendre par un système non humain.

Pour ce faire nous avons plusieurs écoles de pensée :

  • La précision finie : Dans ce cas nous fixons un nombre de bits servant à représenter le nombre. Ainsi le nombre de nombres représentables est limitée par le nombre de bits 8 bits = 256 nombres.
  • La multi-précision : Dans ce cas la le nombre de bits représentant le nombre est flexible, il varie selon les besoins. Cependant cela demande au développeur de nombreuses gymnastiques arithmétique pour se prémunir des erreurs.
  • La précision infinie : Cette représentation est très coûteuse en mémoire et demande d'importante ressources lors de l'application des algorithmes.

La norme IEEE 754

Un nombre dans la représentation IEEE 754 se décompose en plusieurs parties, le signe, l'exposant et la mantisse.

La taille de ces différentes parties varie suivant les valeurs dans le tableau suivant :

 SigneExposantMantisseDécalageTotal
Simple précision1 bit8 bits23 bits127 bits32 bits
Double précision1 bit11 bits52 bits1023 bits64 bits
Grande précision1 bit15 bits64 bits16383 bits80 bits

 

Ainsi pour constituer un nombre en norme IEEE 754 il faut le constituer en appliquant la formule suivante :

\begin{aligned} fl(a)=(-1)^{S}\times(1+M)\times2^{E-127} \end{aligned}

Dans cette formule S représente le signe. Ce dernier est 0 en cas de nombre positif et 1 en cas de nombre négatif. M représente la mantisse, soit la représentation en puissance de 2 du chiffre. E représente l'exposant il est calculé à partir de la formule suivante E=x+(2^{y-1}-1) avec x = valeur de l'exposant et y = nb de bit l'exposant.

Prenons un exemple :

\begin{aligned} -5,375 \\  -(4+1+0,25+0,125) \\ -(2^{2}+2^{0}+2^{-2}+2^{-3}) \\ S=2^{0} \\ M = 101,011 = 1,01011\times2^{2}=(01011)_{2} \\ E=2+(2^{8-1}-1)=129=(10000001)_{2} \\ 1\:10000001\:0101100000000000000000 \end{aligned}

Le décodage d'un nombre en IEEE 754 simple précision s'effectue de la manière suivante :

  • Le nombre est convertis en bianire
  • On sépare les groupes de bits en fonction de la précision choisi
  • On détermine le signe, l'exposant et la mantisse
  • On calcul $2^{E-D}\times M_{2}$ D étant le décalage
  • On pose les exposants à deux des chiffres de la mantisse, sachant que la partie réelle correspond aux puissances négatives et la partie entière aux positifs
  • On calcul les puissances

Étudions un exemple :

\begin{aligned} (3FC00000)_{16} \\ (00111111110000000000000000000000)_{2} \\ S=0 \\ E =01111111 = 127 \\ M =10000000000000000000000 \\ 2^{127-127}\times (1,1)_{2} \\ (1+2^{-1})_{10} \\ 1,5 \end{aligned}

Erreurs Numériques

Comme nous ne pouvons pas travailler avec des nombres infinis et que l'arithmétique de représentation des nombres en machine est limité nous devons prendre en compte le fait que des erreurs vont se produire dans les calculs. Afin de pouvoir les contrer au mieux nous devons pouvoir les calculer et les anticiper.

Afin de mesurer l'ereur de codage dans une mantisse de $t$ bits nous utilisons la formule suivante :

\begin{split}
                    |a - fl(a)| &= 10^{q}(0,a_1 a_2 \cdots a_t a_{t+1} \cdots - 0,a_1 a_2 \cdots a_t) \\
                                &= 10^{q}(0,0\cdots 0 a_{t+1} \cdots) = 10^{q-t}(0,a_{t+1} \cdots) \times \frac{|a|}{|a|} \\
                                &= \frac{ 10^{q-t} }{ 10^{q} } \times \frac{ 0,a_{t+1} \cdots }{ 0,a_1 \cdots } \times |a| = 10^{-t}\times \frac{ 0,a_{t+1} \cdots }{ 0,a_1 \cdots } \times |a| \\
                                &\leq 10^{1-t} \times |a|
\end{split}

La stabilité d'un algorithme représente sa capacité à l'amplification des erreurs lors d'une séquence d'opérations. La stabilité d'un algorithme va dépendre de l'arithmétique de l'ordinateur ainsi que de l'ordre dans lequel vont être effectué les opérations.

Le conditionnement d'un algorithme