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

Contenu supprimé Contenu ajouté
Ligne 12 :
 
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 certaines 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ée à 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====
 
La première manière de ruser est d'utiliser les identités trigonométriques pour calculer les résultats non-précalculés.
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>.
Ligne 23 ⟶ 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 que certaines opérandes n'ont pas leur résultat stocké dans la mémoire ROM. Et lqu'on ne peut pas les envoyer directementles à la mémoire ROM, elle ne reconnaitrait pas l'adresseopérandes reçuenon-précalculés. A la place, on doit transformer l'opérande envoyénon-précalculées pour obtenir un opérande 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 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====
Ligne 29 ⟶ 31 :
[[File:Interpolation memory - principe.PNG|vignette|upright=0.75|''Interpolation memory'' - principe]]
 
La seconde ruse, quelque peu meilleure, se base sur le même principe : ne mémoriser le résultat que pour une partie des opérandes et calculer les autres à partir des résultats mémorisés. Sauf qu'ici, on n'utilise pas d'identités trigonométriques qui donnent un résultat exact. La seconde ruse ne fait, quemais calculercalcule une approximation du résultat, sauf pour les opérandes dont on a mémorisé directement le résultatpré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