• Aucun résultat trouvé

2.2 Conversion en virgule fixe

2.2.1 Conversion à largeur connue

2.2.1.1 Format virgule fixe inconnu

La première étape de la conversion d’un nombre réel non nulc∈ R en un nombre virgule fixe où seule la largeur w du nombre virgule fixe est connue,

est le calcul de la position de la virgule, qui est déterminée par la position du bit le plus significatif, m. En effet, si m est surestimé, on aura des répétitions

du bit de signe (voir Figure 2.9), et si m est sous-estimé, alors c ne sera pas

représentable dans le format calculé, on parlera alors de débordement (voir partie2.3.1.4).

0 0 0 1 0 1 1

−25 23 2−1

Figure 2.9 – Représentation virgule fixe du nombre 5.5 où la position du msb a été surestimé. En effet le FPF est (5,−1) alors que (3, −1) était suffisant, et

donc il y a deux bits de signes inutiles dans ce cas là.

Il est donc important d’estimer au plus juste la position de ce bit, ce qui revient donc à trouver la puissance de 2 immédiatement supérieure à c (ou

immédiatement inférieure si c < 0).

On veut alors déterminer le plus petit entier naturel m tel que, pour une

constante réelle c∈ R on a l’écriture (potentiellement infinie) en complément à deux suivante :

c =−cm· 2m+ m−1 i=−∞

2. Arithmétique virgule fixe

c’est-à-dire telle que, si c > 0, alors cm = 0 et cm−1 = 1, et si c < 0, alors

cm= 1 et cm−1 = 0.

Compte tenu que la représentation en complément à deux n’est pas symé-trique, on peut alors différencier le cas positif et le cas négatif.

1er cas - c est strictement positif : D’après (2.9), on a cm = 0 et

cm−1= 1, donc c = m−1 i=−∞ ci2i, par conséquent : 2m−1  c < 2m m− 1  log2(c) < m et on en déduit m = log2(c) + 1. (2.10)

Remarque 2.3. En fait, même avec nos hypothèses sur m, on peut avoir c = 2m, dans le cas où ci = 1 pour tout −∞ < i  m − 1. Ce cas particulier

est exclu des hypothèses ici, on peut en effet remplacer un tel nombre par c

aveccm = 1 et ci= 0 pour i m−1 (et on aurait c = c). On a le cas analogue en base 10, où les nombres1.000 . . . et 0.999 . . . sont égaux.

2ème cas - c est strictement négatif : Toujours d’après (2.9), on a

cm= 1 et cm−1 = 0, donc c =−2m+ m−1 i=−∞

ci2i, ce qui nous donne :

−2m  c <−2m−1

m− 1 < log2(−c)  m

et on en déduit

m =

log2(−c). (2.11)

Les deux cas précédents peuvent être regroupés par la formule suivante :

m =   log2(c) + 1 si c > 0  log2(−c) sic < 0 (2.12)

Il s’agit en fait ici, dans les deux cas, d’une première estimation de m. En

effet, nous allons voir dans la suite quem peut nécessiter un réajustement dans

des cas particuliers d’arrondi de la mantisse.

Après cette étape, on connait la position du bit le plus significatif m et la

largeur w dont on dispose pour convertir c en virgule fixe, on peut donc en

déduire la position du bit le moins significatif d’après (2.8) par = m−w+1.

Par conséquent, on peut calculer la valeur de la mantisseC ∈ Z correspondant

aux w bits les plus significatifs de c en complément à deux. Comme c est

un nombre réel, dans le cas général w bits ne suffiront pas pour représenter

2.2. Conversion en virgule fixe

exactement c, on va donc estimer une valeur approchée au plus proche de c

sur w bits. La mantisse C est donc donnée par : C = 

c.2−­

(2.13) où

·est l’opérateur d’arrondi au plus proche. Une fois la mantisseC calculée,

on obtient la valeur virgule fixe de c sur w, notée ˜c, par :

˜

c = C· 2. (2.14)

Considérons maintenant un exemple pour mettre en évidence certains cas particuliers.

Exemple 2.2. Soient une constante c = 127.6 et une largeur w = 8, on

souhaite convertir c sur w bits. La décomposition binaire de c s’écrit :

01111111.100110011001100110011001100110011001100110011000 . . . On commence par calculer m à partir de (2.10) (car c > 0) et on obtient m = 7. Donc, d’après (2.8) et (2.13), on a : C = c.20 = c = 128, et de (2.14) on déduit ˜c = C = 128.

On remarque alors que le format virgule fixe calculé,(7, 0), ne permet pas de représenterc, car C doit appartenir à l’intervalle [˜ −128; 127]. En effet, sur

8 bits, le format permettant de représenter ˜c au plus juste est (8, 1).

On peut observer un phénomène similaire pour les nombres négatifs si on essaye de convertir par exemple −64.4 sur 8 bits. En effet, puisque −64.4 < −64 = −26, la formule (2.11) donnera m = 7 et donc le format virgule fixe

(7, 0), alors que (2.14) donnera ˜c = −64, qui est représentable sur le format

(6, 1). A priori le problème est moindre dans ce cas là, on a juste un bit de signe répété inutilement, mais en regardant de plus près, si on recalcule C et ˜c

avec le format (6, 1) on obtient ˜c =−64.5 qui est un résultat plus précis.

Nous parlerons alors de cas limites car ces deux cas se produisent quand le nombre à convertir est proche de la puissance de 2 immédiatement supérieure. Il est donc nécessaire, une fois quem et C ont été estimés, de vérifier que nous

ne sommes pas dans un cas limite. – SiC = 2w−1 alors – on ajoute 1 àm – on réévalue C = c.2− , avec  = m− w + 1 – SiC =−2w−2 alors – on retranche 1 à m – on réévalue C = c.2− , avec  = m− w + 1

Enfin, on calcule c d’après (˜ 2.14), ce qui achève la conversion de c sur w

2. Arithmétique virgule fixe

Algorithme 1: Conversion d’une constante c sur w bits, c= 0

# 1ère estimation de m Sic > 0 Alors m←log2(c) + 1 ; Sinon m←log2(−c); Fin # Calcul deC C←c.2w−m−1 ;

# Vérification des cas limites SiC = 2w−1 Alors m← m + 1 ; C←c.2w−m−1 ; Fin SiC =−2w−2 Alors m← m − 1 ; C←c.2w−m−1 ; Fin # Calcul de et ˜c ← w − m − 1 ; ˜ c← C · 2;

2.2.1.2 Format virgule fixe connu

Il peut arriver lors d’une conversion d’un réel en virgule fixe que le format virgule fixe soit imposé. Soient c ∈ R un nombre réel à convertir et (m, ) le format imposé pour la conversion. La largeur w est déterminée par (2.8) à partir de (m, ), on peut donc appliquer l’algorithme 1 pour déterminer le FPF idéal dec sur w bits, noté (m, ). Il y a alors deux cas à considérer, le cas m < m et le casm > m (le cas m = m étant trivial).

s

s s s . . .

2m

s . . .

2m

Figure 2.10 – Extension du bit de signe dans le cas m> m.

Cas m < m : Cela signifie que |c| < 2m

donc c est représentable dans le

format imposé. On fait alors une extension du bit de signe, c’est-à-dire qu’on auraci= cm pour m + 1 i  m (voir figure2.10).

2.2. Conversion en virgule fixe

La conversion se fait ensuite sur le format(m, ) en calculant C = 

c.2−­ et ˜c = C· 2. Les cas limites ne sont pas testés puisque le format est imposé et ne peut donc pas être changé.

Cas m < m : Puisque m est estimé au plus juste pour représenter c, ce cas

signifie que c n’est pas représentable sur le format imposé, on parle alors de

débordement (l’anglicisme overflow peut aussi être utilisé). Le traitement des débordements est décrit partie 2.3.1.4 et se fait soit par arithmétique modu-laire, soit par saturation. Dans les deux cas, les bits en positions m à m+ 1 sont supprimés et le traitement effectué sur les bits restants dépend du choix du mode de débordement.