Addition en Virgule Flottante

Format des nombres en virgule flottante

Trois champs composent l'écriture binaire en virgule flottante des nombres réels. Le signe S (1 bit), l'exposant E (8 bits) et la mantisse M, ou significande (23 bits).
La valeur du nombre est (-1)S * 2(E - 127) * (1 + M / 8388608 ) . Cependant si E = 0, le nombre dénormalisé vaut (-1)S * 2-126 * ( M / 8388608 ) et si E = 255, la valeur est infinie.
Vérifiez que vous vous maîtrisez ce format en donnant l'écriture (32 bits) des nombres proposés.

Addition et soustraction

Les réels étant codés en "signe/valeur-absolue", un seul bit permet de changer le signe d'un opérande. En conséquence le même opérateur effectue indifféremment l'addition ou la soustraction suivant les signes des opérandes.
L'addition/soustraction de deux réels S = A + B est plus complexe que la multiplication ou la division de réels.
Elle se déroule en 4 étapes:

  • Alignement des mantisses si les exposants de A et B sont différents
  • Addition ou soustraction des mantisses alignées
  • Renormalisation de la mantisse de la somme S si elle n'est pas normalisée
  • Arrondi de la mantisse de la somme S'

L'alignement conserve un "bit de garde" et un "bit d'arrondi" et produit un "bit collant" utilisés pour l'arrondi au plus près. Le "bit collant" est le "ou logique" de tous les bits éjectés dans l'alignement.

Additionneur/ soustracteur

Un additionneur flottant est formé de huit blocs:
Bloc 1: entrent les deux exposants, sort plus grand exposant (8 bits), sort la valeur absolue de la différence des exposants (5 bits), sort le bit implicite du plus petit opérande et le bit implicite du plus grand opérande.
Bloc 2: entrent les deux mantisses, sort à gauche la mantisse du plus petit opérande (23 bits), sort à droite la mantisse du plus grand opérande (23 bits). Commande le mux du signe résultat (signe du plus grand).
Décaleur 1: décale vers la droite la mantisse du plus petit, conserve un "bit de garde" et un "bit d'arrondi" et ajoute un "bit collant"; total 27 bits.
Complémenteur: fait sur commande le complément logique en vue d'une soustraction.
Additionneur 1: additionne les deux mantisses alignées et la retenue, sort un résultat arrondi et une retenue, en tout 28 bits (dont 2 avant la virgule et 5 servant à l'arrondi dont 2 perdus).
Compteur de zéros en tête: la sortie ZLC compte nombre de '0' en poids forts ou vaut 1 si le comptage est inhibé.
Décaleur 2: décale vers la gauche de ( ZLC – 2 ) positions (de 2 positions à droite jusqu'à 23 positions à gauche). Sort la mantisse du résultat, le bit sortant poids fort est perdu (bit '1' implicite si normalisé).
Additionneur 2: soustrait ( ZLC – 1 ) du plus grand exposant. Sort l'exposant du résultat.

 

Cet additionneur/soustracteur implémente fidèlement la norme IEEE 754. Cependant certains blocs qui encombreraient le dessin n'y figurent pas, nommément le calcul de l'arrondi, la gestion des exceptions (infini, NaN, dénormalisé) et des "flags".

Décaleur paramétrable

Pour l'addition en virgule flottante, il faut effectuer des additions/soustraction d'entiers, des décalages paramétrables (à droite pour l'alignement, à gauche pour la renormalisation) et un comptage des zéros en poids forts.
Nous savons effectuer l'addition/soustraction en temps log2(n). Le décalage paramétrable est également en temps log2(n). Un arbre de portes "ou" calcule le "bit collant".

Compteur de zéros en tête ( ZLC )

Un arbre binaire décompte le nombre de '0' en poids forts de la chaîne de bits S par dichotomie. Si la taille des sous-chaînes est une puissance de 2, alors il n'y a pas besoin d'additionneur mais seulement de multiplexeurs. En fait seule la taille de la sous-chaîne de gauche doit être une puissance de 2, la taille de la sous-chaîne de droite doit simplement être inférieure ou égale à celle de gauche.

Cellule de compteur de zéros en tête

Cette cellule combine le nombre de '0' en poids forts de chacune des deux chaînes de longueur 16 pour obtenir le nombre de '0' en poids forts de la concaténation des deux chaînes.
. si X < 16 alors S = X sinon S = 16 + Y

Prédiction de zéros en tête

A partir des mantisses A et B on peut construire une chaîne de bits P ayant (à 1 près) le même nombre de zéros en tête que le résultat de la soustraction D = A – B sans effectuer la soustraction . En entrée d'un ZLC, la chaîne P prédit le nombre de décalage. Si le résultat du décalage a encore un zéro en tête, il faut le décaler de une position pour le normaliser. Dans le cas contraire, ce résultat est déjà normalisé.
  La prédiction est valable si A est normalisé et B inférieur ou égal à A, ce qui est le cas dans une soustraction de mantisses. Alors les zéros en tête viennent de la séquence de retenue 'P'* 'G' 'K'* , formée d'un certain nombre (éventuellement nul) de 'P' suivi de un seul 'G' puis d'un certain nombre de 'K' suivi d'autre chose que 'K' . Le prédicteur sort un '0' pour toute paire dans cette séquence: 'P' 'P' ; 'P' 'G' ; 'G' 'K' et 'K' 'K' et sort un '1' pour toute paire hors de la séquence.
Ce prédicteur ne tient pas compte de la propagation de retenue, d'où une possibilité de bits faussement prédits. Cependant seul le bit en dernière position dans la séquence
'P'* 'G' 'K'* peut être faussement prédit.

Ajustement de zéros en tête

Ce circuit rend 'Y' si la prédiction du nombre de zéros en tête est fausse, donc trop petite de 1. La prédiction est fausse si la séquence de retenues commence par 'P'* 'G' 'K'* 'P' 'P'* 'K'.
  Z indique une chaîne 'K'* 'P'*
Q indique une chaîne 'P'* 'G' 'K'* 'P'* (contenant un seul 'G')
N indique une chaîne commençant par 'P'* 'K'
Y indique une chaîne commençant par 'P'* 'G' 'K'* 'P' 'P'* 'K', c'est à dire Q suivi de N.
U marque toute autre chaîne.

Cellule de prédiction

La cellule de prédiction des '0' en tête génère un '1' à la fin de la chaîne 'P'* 'G' 'K'* et des '0' à l'intérieur de celle-ci. Vérifiez que vous maîtrisez sa table de vérité.

Valeur absolue de la différence

Le Bloc1 calcule la valeur absolue de la différence des exposants pour commander le Décaleur 1. Le signal "rebouclage" indique A ³ B qui choisit le plus grand exposant.

Arrondi au plus proche

Dans une addition/soustraction virgule flottante, la sortie S de l'additionneur est normalisée par décalage. Cette sortie S, de 28 bits, est étiquetée "sortie add." dans la figure ci-dessus. Ensuite S est arrondie au plus proche par l'ajout de 0 ou 1 ulp pour donner finalement la mantisse du résultat.
Vérifiez que vous vous maîtrisez la renormalisation et l'arrondi au plus proche.
 

La flèche verticale permute l'ordre du décalage et de l'ajout. Le décalage à gauche de plus de 1 position n'entraîne jamais d'ajout. En pré-décalant la soustraction de une position à gauche on se ramène pour l'arrondi simplement aux cas :

  • décalage à droite de 0 ou 1 position (S ou S/2) puis
  • ajout de 0 ou ulp (avec propagation de retenue) (S ou S/2 ou S + ulp ou S/2 + ulp)

Spéculation de l'arrondi

Pour éviter la propagation de retenue au cours de l'arrondi, on précalcule avec un additionneur à 3 sorties en même temps que S les sorties S' = S + 1 et S" = S + 2. Avec le décalage des sorties S et S" le résultat final est S, S/2, S' = S + 1, S"/2 = S/2 + 1.