« Fonctionnement d'un ordinateur/Les circuits de calcul flottant » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 101 :
[[File:CORDIC (Bit-Parallel, Iterative, Circular Rotation).svg|centre|vignette|upright=2|CORDIC (Bit-Parallel, Iterative, Circular Rotation)]]
 
==NombresLes nombres flottants IEEE754==
 
NousIl allonsest naturellementtemps commencerde parvoir étudiercomment lescréer des circuits de calculs qui manipulent des nombres flottants au format IEEE754. Rappelons que la norme IEEE754 précise le comportement de 5 opérations: l'addition, la soustraction, la multiplication et la division. Paradoxalement, les multiplications, divisions et racines carrées sont relativement simples à calculer avec des nombres flottants, là où l'addition et la soustraction sont plus complexes. Dans ce qui va suivre, nous allons d'abord parler des procédés d'arrondis des résultats, applicables à toutes les opérations, avant de poursuivre par l'étude des opérations simples (multiplications, divisions, racines carrées), avant de terminer avec les opérations compliquées (addition et soustraction).
 
===NormalisationLa normalisation et les arrondis flottants===
 
Calculer sur des nombres flottants peut sembler trivial, mais les mathématiques ne sont pas vraiment d'accord avec cela. MaisEn effet, le résultat dud'un calcul devraavec des flottants n'est pas forcément un flottant valide. LIl doit subir quelques transformations pour être un nombre flottant : onil peutdoit citersouvent lesêtre arrondisarrondi, mais il doit aussi passer par d'autres étapes dites de normalisation.
 
[[File:Normalisation in circuit.png|centre|Normalisation in circuit]]
 
====PrénormalisationLa prénormalisation====
 
La '''prénormalisation''' gère le bit implicite. Lorsqu'un circuit de calcul fournit son résultat, celui-ci n'a pas forcément son bit implicite à 1. On est obligé de décaler la mantisse du résultat de façon à ce que le bit implicite soit un 1. Pour savoir de combien de rangs il faut décaler, il faut compter le nombre de zéros situés avant le 1 de poids fort, avec un circuit spécialisé. Ce circuit permet aussi de détecter si la mantisse vaut zéro. Mais si on décale notre résultat de n rangs, cela signifie qu'on le multiplie par 2 à la puissance n. Pour régler ce problème, il faut corriger l'exposant du résultat pour annuler la multiplication par 2 à la puissance n. Il suffit pour cela de lui soustraire n, le nombre de rangs dont on a décalé la mantisse.
Ligne 117 :
[[File:Circuit de prénormalisation.jpg|centre|Circuit de prénormalisation.]]
 
====NormalisationLa normalisation====
 
Une fois ce résultat calculé, il faut faire un arrondi du résultat avec un circuit de '''normalisation'''. Malheureusement, il arrive que ces arrondis décalent la position du bit implicite d'un rang, ce qui se résout avec un décalage si cela arrive. Le circuit de normalisation contient donc de quoi détecter ces débordements et un décaleur. Bien évidemment, l'exposant doit alors lui aussi être corrigé en cas de décalage de la mantisse.
Ligne 123 :
[[File:Circuit de postnormalisation.jpg|centre|Circuit de postnormalisation.]]
 
====Résumérésumé====
 
Le circuit complet, qui effectue à la fois normalisation et arrondis est le suivant :
Ligne 129 :
[[File:Circuit de normalisation-arrondi.PNG|centre|Circuit de normalisation-arrondi]]
 
===La multiplication flottant===
===Multiplication===
 
Prenons deux nombres flottants de mantisses m1 et m2 et les exposants e1 et e2. Leur multiplication donne :
Ligne 149 :
[[File:Multiplieur flottant avec normalisation.PNG|centre|Multiplieur flottant avec normalisation]]
 
===DivisionLa division flottante===
 
La division fonctionne sur le même principe que la multiplication, si ce n'est que les calculs sont quelque peu différents : les exposants sont soustraits et que les mantisses sont divisées.
Ligne 161 :
On voit que les mantisses sont divisées entre elles, tandis que les exposants sont soustraits.
 
===RacineLa racine carrée flottante===
 
Le calcul de la racine carrée d'un flottant est relativement simple. Par définition, la racine carrée d'un flottant <math>m \times 2^e</math> vaut :
Ligne 176 :
[[File:Racine carrée FPU.PNG|centre|Racine carrée FPU]]
 
===AdditionL'addition et la soustraction flottante===
 
La somme de deux flottants n'est simplifiable que quand les exposants sont égaux : dans ce cas, il suffit d'additionner les mantisses. Il faut donc mettre les deux flottants au même exposant, l'exposant choisi étant souvent le plus grand exposant des deux flottants. Convertir le nombre dont l'exposant est le plus petit demande de décaler la mantisse vers la droite, d'un nombre de rangs égal à la différence entre les deux exposants. Pour comprendre pourquoi, il faut se souvenir que décaler vers la droite diminuer l'exposant du nombre de rangs. Pour faire ce décalage, on utilise un décaleur et un circuit qui échange les deux opérandes (histoire d'envoyer le plus petit exposant dans le décaleur). Ce circuit d'échange est piloté par un comparateur qui détermine quel est le nombre avec le plus petit exposant.
Ligne 190 :
[[File:Additionneur flottant - circuit complet.PNG|centre|Additionneur flottant - circuit complet]]
 
===FonctionsLes fonctions trigonométriques===
 
L'implémentation des fonctions trigonométriques est quelque peu complexe, du moins pour ce qui est de créer des circuits de calcul du sinus, cosinus, tangente, etc. S'il est possible d'utiliser une mémoire à interpolation, la majorité des processeurs actuels réalise ce calcul à partir d'une suite d'additions et de multiplications, qui donne le même résultat. Cette suite peut être implémentée via le logiciel, un petit bout de programme s'occupant de faire les calculs. Il est aussi possible, bien que nettement plus rare, d'implémenter ce bout de logiciel directement sous la forme de circuits : la boucle de calcul est remplacée par un circuit séquentiel. Mais il faut avouer que cette solution n'est pas pratique et que faire les calculs au niveau logiciel est nettement plus simple, tout aussi performant (et oui !) et moins couteux. La tactique habituelle consiste à utiliser une '''approximation de Taylor''', largement suffisante pour calculer la majorité des fonctions trigonométriques.