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

Contenu supprimé Contenu ajouté
mAucun résumé des modifications
Ligne 7 :
===L'usage d'une mémoire à interpolation===
 
Les circuits de calcul trigonométriques les plus simples utilisent ce qu'on appelle une '''mémoire de précalcul'''. Avec cette technique, il n'y a pas de circuit de calcul proprement dit, mais une ROM qui contient les résultatrésultats des calculs possibles. L'opérande du calcul sert d'adresse mémoire, et le mot mémoire associé à cette adresse contient le résultat du calcul demandé. Cette technique peut s'appliquer pour n'importe quelle opération, au point que tout circuit combinatoire existant peut être remplacé par une mémoire ROM.
 
[[File:ALU fabriquée à base de ROM.png|centre|ALU fabriquée à base de ROM]]
Ligne 13 :
Cependant, si on utilisait cette technique telle qu'elle, la mémoire ROM serait trop importante pour être implémentée. Rien qu'avec des nombres à virgule fixe de plus de 16 bits, il faudrait une mémoire de 2^16 cases mémoire, chacune faisant 16 bits, et ce pour une seule opération. Ne parlons même pas du cas avec des nombres de 32 ou 64 bits ! Pour cela, on va donc devoir ruser pour réduire la taille de cette ROM.
 
Mais qui dit réduire la taille de la ROM signifie que certainescertains résultats ne seront pas connus. Il y aura forcément des opérandes pour lesquelles la ROM n'aura pas mémorisé le résultat et pour lesquels la mémoire de précalcul seule ne peut rien faire. La solution sera alors de calculer ces résultats à partir d'autres résultats connus et mémorisés dans la mémoire ROM. La mémoire ROM n'a donc pas besoin de stocker tous les résultats et peu se contenter de ne mémoriser que les résultats essentiels, ceux qui permettent de calculer tous les autres. On doit distinguer deux types d'opérandes : celles dont le résultat est stocké dans la ROM, celles dont le résultat est calculéecalculé à partir des précédentes. Les opérandes dont le résultat est en ROM seront appelées des opérandes précalculés dans ce qui suit, alors que les autres seront appelées les opérandes non-précalculés.
 
====Une première optimisation : les identités trigonométriques====
Ligne 25 :
Enfin, l'identité <math>\sin{a} = \sin{\pi - a}</math> permet de calculer la moitié des sinus quand l'autre est connue.
 
Et on peut penser à utiliser d'autres identités trigonométriques, mais pas les trois précédentes sont déjà assez intéressantes. Le problème est qu'on ne peut pas envoyer les opérandes non-précalculés. A la place, on doit transformer l'opérande non-précalculées pour obtenir un opérande pré-calculéprécalculé, géré par la mémoire ROM. Il faut donc des circuits qui se chargent de détecter ces opérandes , de les transformer en opérandes reconnuesreconnus par la ROM, puis de corriger la donnée lue en ROM pour obtenir le résultat adéquat. Les circuits en question dépendent de l'identité trigonométrique utilisée, aussi on ne peut pas faire de généralités sur le sujet.
 
====Une seconde optimisation : l'interpolation linéaire====
Ligne 33 :
La seconde ruse n'utilise pas d'identités trigonométriques qui donnent un résultat exact, mais calcule une approximation du résultat, sauf pour les opérandes précalculés. L'idée est de prendre les deux (ou trois, ou quatre, peu importe) résultats précalculés les plus proches du résultat voulu, et de les utiliser pour faire une approximation.
 
L'approximation du résultat se calcule en faisant une '''interpolation linéaire''', à savoir une moyenne pondérée des deux résultats les plus proches. Par exemple, si on connait le résultat pour sin(45°) et pour sin(50°), alors on peut calculer sin(47,5°), sin(47°), sin(45,5°), sin(46,5°) ou encore sin(46°) en faisant une moyenne pondérée des deux résultats. Une telle approximation est largement suffisante pour beaucoup d'applications.
 
Le circuit qui permet de faire cela est appelée une '''mémoire à interpolation'''. Le schéma de principe du circuit est illustré ci-contre, alors que le schéma détaillé est illustré ci-dessous.
Ligne 161 :
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.
 
Pour le démontrer, prenons deux flottants <math>m_1 \times 2^{e_1}</math> et <math>m_2 \times 2^{e_2}</math> et divisons le premier par le second. On a alors :
 
: <math>\frac{m1 \times 2^{e_1}}{m2 \times 2^{e_2}}</math>
 
On applique les règles sur les fractions :
Ligne 217 :
Maintenant, nous allons fabriquer une unité de calcul pour les flottants logarithmiques. Nous avions vu les flottants logarithmiques dans le chapitre [[Fonctionnement d'un ordinateur/Codage des nombres|Codage des nombres]]. Pour résumer rapidement, ce sont des flottants qui codent uniquement un bit de signe et un exposant, mais sans la mantisse (qui vaut implicitement 1). L'exposant stocké n'est autre que le logarithme en base 2 du nombre codé, d'où le nom donné à ces flottants. Au passage, l'exposant est stocké dans une représentation à virgule fixe.
 
Nous avions dit dans le chapitre sur le codage des nombres que l'utilité de cette représentation est de simplifier certains calculs, comme les multiplications, divisions, puissances, etc. EtEh bien vous allez rapidement comprendre pourquoi dans cette section. Nous allons commencer par voir les deux opérations de base : la multiplication et la division. Celles-ci sont en effet extrêmement simples dans cet encodage, bien plus que l'addition et la soustraction. C'est d'ailleurs la raison d'être de cet encodage : simplifier fortement les calculs multiplicatifs, quitte à perdre en performance sur les additions/soustractions.
 
===La multiplication et la division de deux flottants logarithmiques===