ArcSinus et ArcTangente

Calcul de Arc Tangente

Pour calculer A = ArcTangente(Y) on part d'un vecteur d'extrémité (1, Y). L'angle formé par ce vecteur avec l'axe horizontal a la valeur A cherchée. Pour mesurer cet angle, on fait subir au vecteur une suite de "pseudoRotations" pour l'amener à l'horizontal, et on cumule les angles arctg (2-j ) de ces "pseudoRotations" dans A (la constante k n'intervient pas ici).
  X0 = 1 ; Y0 = Y ; A0 = 0 ;
si Yj > 0 alors
    { Xj+1 = Xj + Yj * 2-j ; Yj+1 = Yj Xj * 2-j ; Aj+1 = Aj arctg(2-j ) ; }
sinon
    { Xj+1 = Xj Yj * 2-j ; Yj+1 = Yj + Xj * 2-j ; Aj+1 = Aj + arctg(2-j ) ; }

Sinus, Cosinus et Arc Tangente

En "retournant" le calcul de sinus/cosinus, l'applet calcule arc tangente. Le "Nombre de bits" fixe à la fois le nombre de pas et la précision des calculs. Cliquer la flèche verticale change la présentation du tableau. La touche "Mise à zéro" permet le contrôle 'à la main' de la convergence.

Calcul de Arc Sinus

Pour calculer A = ArcSinus(S) on part d'un vecteur horizontal de norme k et on lui fait subir une suite de "pseudoRotations" pour amener sa norme à 1 et l'ordonnée Y de son extrémité à S. L'angle formé par ce vecteur avec l'horizontale a la valeur A cherchée. Cet algorithme donne un résultat médiocre. En effet le vecteur est trop court (sa norme croit de k à 1) pour que son extrémité soit sur le cercle et en conséquence la comparaison de l'ordonnée Y de son extrémité avec S est parfois erronée. Essayer avec S légèrement supérieur à k (environ 0,60725).
A chaque itération, la norme du vecteur est multipliée par Ö1+2-2j, multiplier S par la même constante rendrait la comparaison totalement pertinente.
La "double rotation" rend cette multiplication plus sympathique. En effet la multiplication par le carré de cette constante se réduit à une addition.
Dans l'applet qui suit, tous les vecteurs sont dessinés avec la même longueur car sur le dessin leurs coordonnées sont divisés par les constantes successives, ce qui fait que S ne bouge pas. X1 = 1 ; Y1 = 0 ; A1 = 0 ; S1 = S ;
si Yj > Sj alors

Xj+1 = Xj + 2 * Yj * 2-j Xj * 2-2j ;
Yj+1 = Yj 2 * Xj * 2-j Yj * 2-2j ;
Aj+1 = Aj 2 * arctg(2-j ) ; Sj+1 = Sj + Sj * 2-2j ;

sinon

Xj+1 = Xj 2 * Yj * 2-j Xj * 2-2j ;
Yj+1 = Yj + 2 * Xj * 2-j Yj * 2-2j ;
Aj+1 = Aj + 2 * arctg(2-j ) ; Sj+1 = Sj + Sj * 2-2j ;

Pour chaque itération (qui gagne un bit) cet algorithme exige quatre additions/soustractions pour la double rotation, plus une addition/soustraction pour cumuler les angles arctg(2-j ) et enfin une addition pour multiplier S par la constante 1+2-2j .



Table Bipartite

table des fonctions On peut précalculer puis stocker les valeurs d'une fonction en table. Cependant la taille de cette table croît très vite avec la précision requise, ce qui limite en pratique cette approche. Pour des fonctions continues avec une faible variation de pente (cas de nombreuses fonctions), on peut ne stocker que quelques points dans une première table "TIV", et les pentes permettant l'interpolation sans calcul dans une autre table "TO".

L'applet ci-dessous rempli les tables pour les fonctions et les intervalles listés à gauche et permet d'observer graphiquement le résultat. La valeur des tables est imprimable en VHDL.

Pour ajouter des fonctions il faudrait modifier le source Java.

La fonction arcsin(x) présente une très forte variation de pente autour de 1, elle illustre les limites de la compression de table par bipartition.

Un raffinement de la méthode est la table multipartite.