« Fonctionnement d'un ordinateur/Les circuits de calcul flottant » : différence entre les versions
Contenu supprimé Contenu ajouté
grammaire + orthographe |
|||
Ligne 3 :
==Flottants à virgule fixe==
Pour les flottants à virgule fixe, les opérations sont similaires à ce qu'on a avec des nombres entiers si ce n'est qu'il faut souvent ajouter une division (ou un décalage si le facteur de conversion est bien
===Mémoire à interpolation===
Une autre solution est d'utiliser ce qu'on appelle une '''mémoire de précalcul'''. Cette technique mémorise le résultat du calcul dans une mémoire ROM, ROM qui sera adressée par l'opérande : le mot mémoire qui correspond à une adresse (donc à
[[File:ALU fabriquée à base de ROM.png|centre|ALU fabriquée à base de ROM]]
====Identités trigonométriques====
La méthode la plus simple est de ne mémoriser qu'une partie des résultats, à savoir les résultats qui correspondent à un nombre limité d'opérandes. On ne peut alors pas envoyer les opérandes directement à cette ROM. Pour résoudre ce petit problème, on peut transformer l'opérande
====Interpolation linéaire====
Ligne 29 :
===CORDIC===
Sur du matériel peu puissant, les fonctions trigonométriques peuvent être calculées avec l''''algorithme CORDIC'''. Celui-ci est notamment très utilisé dans les calculatrices modernes, qui possèdent un circuit séquentiel ou un logiciel pour exécuter cet algorithme. Cet algorithme fonctionne par
: <math> V = \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} \cos \gamma \\ \sin \gamma \end{pmatrix}</math>
Ligne 37 :
L'algorithme CORDIC part d'un principe simple : il va décomposer un angle en angles plus petits, dont il connait le cosinus et le sinus. Ces angles sont choisis de manière à avoir une propriété assez particulière : leur tangente est une puissance de deux. Ainsi, par définition de la tangente, on a : <math>\frac{y}{x} = \frac{1}{2}, \frac{1}{4}, \frac{1}{8}, \frac{1}{16}, \frac{1}{32}, ...</math>. Vous aurez deviné que cette propriété se marie bien avec le codage binaire et permet de simplifier fortement les calculs. Nous verrons plus en détail pourquoi dans ce qui suit. Toujours est-il que nous pouvons dire que les angles qui respectent cette propriété sont les suivants : 45°, 26.565°, 14.036°, 7,125°, ... , 0.0009°, 0.0004°, etc.
L'algorithme part d'un angle de 0°, qu'il met à jour à chaque itération, de manière à se rapprocher de plus en plus du résultat. Plus précisément, cet algorithme
[[File:CORDIC-illustration.png|centre|500px|CORDIC-illustration]]
Ligne 59 :
: <math> \begin{pmatrix} x' \\ y' \end{pmatrix} = K \begin{pmatrix} x - 2^{-i} \times y \\ x \times 2^{-i} + y \end{pmatrix} </math>
Il faut noter que la constante <math>K</math> peut être omise dans le calcul, tant qu'on effectue la multiplication à la toute fin de l'algorithme. A la fin de l'algorithme, on devra calculer le produit de tous les <math>K(i)</math> et y multiplier le résultat. Or, le produit de
: <math> \begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} x - 2^{-i} \times y \\ x \times 2^{-i} + y \end{pmatrix} </math>
Ligne 81 :
[[File:CORDIC base circuits.PNG|centre|CORDIC base circuits]]
Pour effectuer plusieurs itérations, il est
[[File:CORDIC (Bit-Parallel, Iterative, Circular Rotation).svg|centre|CORDIC (Bit-Parallel, Iterative, Circular Rotation)]]
Ligne 88 :
==Nombres flottants IEEE754==
Nous allons naturellement commencer par étudier les nombres flottants 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
===Normalisation et arrondis===
Ligne 157 :
: <math>\sqrt{m} \times 2^{\frac{e}{2}}</math>
On voit qu'il suffit de calculer la racine carrée de la mantisse et de diviser l'
[[File:Racine carrée FPU.PNG|centre|Racine carrée FPU]]
Ligne 177 :
===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
[[File:Implémentation matérielle naive et inneficiente d'un calcul de sinus par série de taylor.PNG|centre|Implémentation matérielle naive et inneficiente d'un calcul de sinus par série de taylor]]
Ligne 183 :
==Flottants logarithmiques==
Maintenant, nous allons fabriquer une unité de calcul pour les flottants logarithmiques. Nous allons commencer par voir les deux opérations de base : la multiplication et la division. Celles
===Multiplication et division===
Ligne 201 :
Pour l'addition et la soustraction, la situation est beaucoup plus corsée, vu qu'il n'y a pas vraiment de formule mathématique pour simplifier le logarithme d'une somme. Dans ces conditions, la seule solution est de pré-calculer celle-ci. Notre unité de calcul va donc incorporer une mémoire ROM, dans laquelle on stockera le résultat de la somme de deux nombres logarithmiques. En envoyant les deux nombres concaténés sur le bus d'adresse, on récupère ainsi l'exposant de leur somme. Seul problème : la taille de cette ROM est tout simplement gigantesque pour des flottants de 32 à 64 bits. Pour des nombres de 16 bits, cela passe relativement bien : une mémoire de 32 kilo-octets suffit. Mais pour du 32 bits, on atteint 16 gibi-octets. Dans ces conditions, on doit ruser pour diminuer la taille de la ROM en utilisant diverses propriétés mathématiques. L'idée est de transformer notre addition en une opération plus simple, qui peut se pré-calculer plus facilement. La table ainsi obtenue devra être plus petite.
Premièrement, partons de la formule suivante, qui pose l'équivalence des termes suivants :
: <math> \log(x+y) = \log \left(x + x \times \frac{y}{x}\right) = \log \left[ x \times \left(1+\frac{y}{x}\right) \right] </math>
Ligne 223 :
* et d'une ROM.
[[File:Unité de calcul logarithmique.PNG|centre|Unité de calcul logarithmique]]
|