« 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.
===
Les circuits de calcul trigonométriques les plus simples utilisent ce qu'on appelle une '''mémoire de précalcul'''.
[[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
====
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.
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.
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
{|
|