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

Contenu supprimé Contenu ajouté
Ligne 5 :
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 choisi). Les circuits de calculs sont donc les mêmes. Cependant, certaines opérations impossibles avec des entiers deviennent possibles avec de tels flottants. C'est le cas du calcul des fonctions trigonométriques. Il est possible de créer des circuits qui effectuent des opérations trigonométriques, mais ceux-ci sont peu utilisés dans les ordinateurs actuels. La raison est que les calculs trigonométriques sont assez rares et ne sont réellement utilisés que dans les jeux vidéos (pour les calculs des moteurs physique et graphique), dans les applications graphiques de rendu 3D et dans les applications de calcul scientifique. Ils sont par contre plus courants dans les systèmes embarqués, bien que leur utilisation reste quand même assez peu fréquente. Malgré leur rareté, il est intéressant de voir comment sont conçus ces circuits de calcul trigonométrique en virgule fixe.
 
===MémoireL'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'''. CetteAvec cette technique, mémoriseil len'y résultata dupas calculde danscircuit unede mémoirecalcul ROMproprement dit, mais une ROM qui seracontient adresséeles parrésultat ldes calculs possibles. L'opérande :du lecalcul motsert d'adresse mémoire, quiet correspondle àmot une adressemémoire (doncassocié à uncette opérande)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]]
 
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 flottantsnombres à virgule fixe de plus de 16 bits, lail faudrait une mémoire ROMde serait2^16 tropcases importantemémoire, chacune faisant 16 bits, et ce pour êtreune implémentéeseule 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.
 
====IdentitésUne première optimisation : les identités trigonométriques====
 
La première ruse est de calculer certains 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. Et pour cela, on peut utiliser les 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 envoyé pour obtenir un opérande géré par la mémoire ROM. Une première technique serait d'utiliser des identités trigonométriques pour simplifier les calculs. Par exemple, on sait que <math> \sin{ - a } = - \sin{ a } </math>, ce qui permet d'éliminer la moitié des valeurs stocker dans la ROM : on a juste à utiliser un comparateur et un inverseur pour faire le calcul de <math> \sin{ - a } </math> à partir de celui de <math> \sin{ a } </math>. De même, l'identité <math> \sin{a} = \cos{\frac{\pi}{2} - a} </math> permet de calculer des cosinus à partir de sinus déjà connus, ce qui élimine le besoin d'utiliser une mémoire séparée pour les cosinus. Enfin, l'identité <math> \sin{a} = \sin{ \pi - a} </math> permet de calculer la moitié des fonctions sin quand l'autre est connue. Les trois identités trigonométriques permettent de diviser par quatre le nombre de valeurs à mémoriser dans la mémoire ROM.
 
Par exemple, on sait que <math>\sin{-a} = - \sin{a}</math>, ce qui permet d'éliminer la moitié des valeurs stocker dans la ROM. On a juste à utiliser un comparateur et un inverseur pour faire le calcul de <math>\sin{-a}</math> à partir de celui de <math>\sin{a} </math>.
====Interpolation linéaire====
 
De même, l'identité <math>\sin{a} = \cos{\frac{\pi}{2} - a}</math> permet de calculer des cosinus à partir de sinus déjà connus, ce qui élimine le besoin d'utiliser une mémoire séparée pour les cosinus.
Une autre solution, quelque peu meilleure, est de prendre les valeurs les plus proches gérées par la ROM qui encadrent l’opérande et de les utiliser pour faire une '''interpolation linéaire'''. On obtient alors une '''mémoire à interpolation''', qui calcule une valeur approximative, bien que largement suffisante pour beaucoup d'applications.
 
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 que certaines opérandes n'ont pas leur résultat stocké dans la mémoire ROM. Et l'on ne peut pas les envoyer directement à la mémoire ROM, elle ne reconnaitrait pas l'adresse reçue. A la place, on doit transformer l'opérande envoyé pour obtenir un opérande 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 reconnues 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====
 
Une autre solutionoptimisation, quelque peu meilleure, est de prendre les valeurs les plus proches gérées par la ROM qui encadrent l’opérande et de les utiliser pour faire une '''interpolation linéaire'''. On obtient alors une '''mémoire à interpolation''', qui calcule une valeur approximative, bien que largement suffisante pour beaucoup d'applications.
 
{|