
Sur Habré, il y avait déjà de nombreux articles consacrés aux calculs rapides de trigonométrie quand c'est fortement nécessaire, mais je voudrais les compléter d'une petite note avec une référence à la trigonométrie scolaire.
Parfois, il peut ne pas y avoir d'implémentation matérielle de la trigonométrie, parfois il peut y avoir d'autres raisons d'inventer des méthodes pour accélérer le calcul.
Math
Rappelons quelques formules simples du cours scolaire.
Commençons par les plus simples:
(1)
sin x = cos (90° - x)
cos x = sin (90° - x)
sin -x = -sin x
cos -x = cos x
- Dans le cas général,
sin (90°N ± x) = ±cos x
pour N impair et ±sin x
pour pair. Le signe est pris sur la base du signe de l'argument dans le quart correspondant du cercle.
Suivant:
(2)
cos (x + y) = cos x cos y - sin x sin y
sin (x + y) = sin x cos y + cos x sin y
Et aussi:
(3)
sin x = x - x^3/3! + x^5/5! - ...
cos x = 1 - x^2/2! + x^4/4! - ...
Le cosinus / sinus de n'importe quel angle peut être réduit à un argument compris entre 0 ° et 45 ° en utilisant les formules du premier groupe.
Pour les petits angles, les fonctions trigonométriques peuvent être réduites à des extensions asymptotiques si les termes rejetés dépassent délibérément la grille de décharge.
Tous les angles intermédiaires peuvent être obtenus en additionnant les grands angles avec un certain pas (et pour eux la trigonométrie peut être considérée comme tabulaire), et les résidus qui donneront tôt ou tard une décomposition linéaire.
Candidature
Supposons que nous travaillons avec des nombres à simple précision IEEE-754, ils ont les noms float, single, etc. Il y a 23 caractères dans la mantisse, ce qui signifie que nous devons obtenir une erreur relative de 2^-23
.
Évaluons la profondeur à laquelle vous devez descendre pour créer des tables d'arguments.
Pour le sinus, nous éliminerons le terme cubique, nous avons donc besoin que sa relation avec le linéaire soit inférieure à l'erreur tolérée, ce qui signifie que: 1 - (x - x^3/3!) / x = x^2/6
2/6 2 ^ -23, d'où il résulte que pour des arguments ne dépassant pas 0,000846 radians, la précision du calcul approximatif du sinus nous suffit. Pour le cosinus, si vous abandonnez le terme quadratique, vous avez besoin d'une précision environ 2 fois meilleure - 0,000488 radians.
Ainsi, nous n'avons pas besoin d'avoir des valeurs tabulaires pour l'argument inférieures à 0,000488 radians.
Pour construire le tableau, nous renormalisons l'argument d'entrée afin que la valeur 0 corresponde à un angle de 0 °, et pour la valeur 1 corresponde à un angle de 45 °, ou pi/4=0.78539816
radians. Ensuite, l'angle minimum obtenu ci-dessus sera converti en 0,0006217 radians, soit environ 1/1600
- c'est plus de 1/2048 = 2^-11
.
Ensuite, vous devrez choisir l'étape des tableaux en fonction de la façon dont nous voulons répartir les calculs, nous diviserons l'exposant 11 en plusieurs parties. Par exemple, vous pouvez le diviser en deux parties: 11 = 6 + 5, puis nous avons besoin de deux tables de taille 64 et 32 entrées (total 96), ou trois parties: 11 = 4 + 4 + 3 (la taille des tables est 16 + 16 + 8 = 40 entrées), mais il y aura plus d'opérations de multiplication - le choix spécifique dépendra de la tâche et des ressources disponibles.
Remarque: une entrée de table est une paire d'arguments sinus et cosinus. S'il est stocké avec une seule précision, la taille d'enregistrement est de 8 octets.
Exemple
Prenons l'exemple de la décomposition 4 + 4 + 3, puis généralisons.
Donc, la tâche: calculer la valeur de sin x
pour un x
arbitraire.
Étape 1. Nous apportons l'argument x
à notre échelle, en le divisant par la constante pi/4
(appelons-le x'
).
Étape 2. En fonction de la valeur de l'argument x'
aide des formules (1), nous sélectionnons la fonction souhaitée afin que son argument soit compris entre 0 et 1 (inclus) (appelons x''
. À cette étape, vous devrez également marquer le signe du résultat .
[supposons par exemple que le sinus soit]
Étape 3. Nous utiliserons les tableaux (je vous rappelle qu'il y en a 3), tandis que les indices dans le tableau seront des "champs de bits" dans la représentation binaire de l'argument x''
- les 4 premiers bits après le point décimal, puis 4 de plus et 3 de plus, et les autres pour les entreprises les bits iront au reste.
Le sinus de table est appelé S1, S2, S3, les cosinus de table sont C1, C2, C3.
Puisque nous avons divisé l'angle par pi/4
, pour obtenir le reste en radians, il doit être multiplié par la même quantité. Le "bit" restant multiplié par pi/4
est noté A. Alors son sinus sera égal à A, et le cosinus - 1.
Étape 4. Combinez tout ce qui s'est passé:
C12 = C1 C2 - S1 S2 S12 = S1 C2 + C1 S2 C123 = C12 C3 - S12 S2 S123 = S12 C3 + C12 S3
|sin x| = S123 + C123 A
|sin x| = S123 + C123 A
(si vous avez obtenu un sinus à l'étape 2)
|sin x| = C123 - S123 A
|sin x| = C123 - S123 A
(si vous avez reçu le cosinus à l'étape 2)
Étape 5. Si, à l'étape 2, nous avons considéré que le résultat devait être négatif, ce moins devrait être entré dans le résultat.
Conclusion
Une approche similaire peut être utilisée à la fois pour le calcul en nombres réels de toute taille et, par exemple, pour la mise en œuvre d'une arithmétique point fixe spécialisée. En fait, à un moment donné, ce n'était que la dernière tâche qui m'a fait creuser plus profondément dans cette direction, mais c'était il y a longtemps.