Addition en Virgule Flottante |
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'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. |
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
|
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. |