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

Contenu supprimé Contenu ajouté
Ligne 45 :
: <math> V = \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} \cos \gamma \\ \sin \gamma \end{pmatrix}</math>
 
[[File:CORDIC Vector Rotation 1.svg|centre|vignette|CORDIC Vector Rotation 1]]
 
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.
Ligne 51 :
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 ajoute ou retranche un angle précédemment cité à chaque itération. Typiquement, on commence par faire une rotation de 45°, puis une rotation de 26.565°, puis de 14.036°, et ainsi de suite jusqu’à tomber sur l'angle qu'on souhaite. A chaque itération, on vérifie si la valeur de l'angle obtenue est égale inférieure ou supérieure à l'angle voulu. Si l'angle obtenu est supérieur, la prochaine itération retranchera l'angle précalculé suivant. Si l'angle obtenu est inférieur, on ajoute l'angle précalculé. Et enfin, si les deux sont égaux, on se contente de prendre les coordonnées x et y du vecteur, pour obtenir le cosinus et le sinus de l'angle voulu.
 
[[File:CORDIC-illustration.png|centre|500pxvignette|upright=2|CORDIC-illustration]]
 
====Du principe aux calculs====
Ligne 91 :
Ainsi, une rotation demande juste de décaler x et y et d'ajouter le tout aux valeurs avant décalage d'une certaine manière. Voici le circuit qui dérive de la matrice précédente. Ce circuit prend les coordonnées du vecteur et lui ajoute/retranche un angle précis. On obtient ainsi le circuit de base de CORDIC.
 
[[File:CORDIC base circuits.PNG|centre|vignette|upright=2|CORDIC base circuits]]
 
Pour effectuer plusieurs itérations, il est possible de procéder de deux manières. :La soitplus onévidente ajouteest un compteur et des circuits, pour que le circuit sd'occupe de toutes les itérations, soit en utilisantutiliser autant de briques de base pour chaque itération.
 
[[File:CORDIC (Bit-Parallel, IterativeUnrolled, Circular Rotation).svg|centre|vignette|upright=2|CORDIC (Bit-Parallel, IterativeUnrolled, Circular Rotation)]]
 
[[File:CORDIC (Bit-Parallel, Unrolled, Circular Rotation).svg|centre|CORDIC (Bit-Parallel, Unrolled, Circular Rotation)]]
Une autre est d'ajouter un compteur et des circuits, pour que enchaines les itérations les plus à la suite des autres dans le même circuit de base.
 
[[File:CORDIC (Bit-Parallel, UnrolledIterative, Circular Rotation).svg|centre|vignette|upright=2|CORDIC (Bit-Parallel, UnrolledIterative, Circular Rotation)]]
 
==Nombres flottants IEEE754==