Le plus rapide de la mise en œuvre du sinus, du cosinus et de la racine carrée en C++ (n'a pas besoin d'être exacte)
Je suis googler la question pour la dernière heure, mais il y a seulement des points de la Série de Taylor ou un exemple de code qui est soit trop lent ou ne compile pas du tout. Eh bien, la plupart des réponses que j'ai trouvé sur Google "Google, c'est déjà demandé", mais malheureusement ce n'est pas...
Je suis de profilage de mon jeu sur le bas de gamme Pentium 4 et découvert que ~85% du temps d'exécution est perdu sur le calcul de sinus, cosinus et de la racine carrée (à partir de la bibliothèque C++ standard dans Visual Studio), et cela semble être très CPU dépendant (sur mon I7 les mêmes fonctions a obtenu que 5% de temps d'exécution, et le jeu est waaaaaaaaaay plus rapide). Je ne peut pas optimiser ces trois fonctions, ni de calculer le sinus et le cosinus en un seul passage (il y interdépendantes), mais je n'ai pas besoin de trop de résultats précis pour ma simulation, afin que je puisse vivre avec plus rapide rapprochement.
Donc, la question: Quels sont le moyen le plus rapide pour calculer le sinus, le cosinus et la racine carrée de float en C++?
MODIFIER
Table de recherche sont de plus en plus douloureux comme résultant de Cache Miss, c'est bien plus coûteux moderne de la CPU de la Série de Taylor. Les Processeurs sont juste tellement vite ces jours-ci, et le cache n'est pas.
J'ai fait une erreur, je l'ai bien que j'ai besoin de calculer plusieurs factorielles pour les Séries de Taylor, et je vois maintenant, ils peuvent être mis en œuvre sous forme de constantes.
De sorte que la mise à jour question: est-il rapide d'optimisation pour la racine carrée ainsi?
EDIT2
Je suis en utilisant la racine carrée de calculer la distance, pas de normalisation - ne peut pas utiliser rapide inverse de la racine carrée de l'algorithme (comme indiqué dans le commentaire: http://en.wikipedia.org/wiki/Fast_inverse_square_root
EDIT3
Je ne peux pas fonctionner sur des carrés des distances, j'ai besoin de distance exacte pour les calculs
- Il a été résolu il y a plusieurs années - utilisation précalculées tableau pour obtenir le sinus/cosinus numéros.
- stackoverflow.com/questions/3688649/...
- Pour l'inverse de la racine carrée (ce qui est fréquent, puisqu'il est impliqué dans le vecteur de normalisation), il est bien connu de formule (en.wikipedia.org/wiki/Fast_inverse_square_root), mais honnêtement, il est un peu dépassé, et probablement 1.0/sqrt(x) va permettre à certaines d'optimisation du compilateur.
- jetez un oeil à ce pour le sinus et le cosinus: devmaster.net/forums/topic/4648-fast-and-accurate-sinecosine
- Ce n'est pas le moyen le plus rapide depuis récemment, la CPU sont waaaay plus rapide maintenant, alors il y a des années et le cache n'est pas beaucoup plus rapide. Je veux dire que le Cache est beaucoup plus douloureux, puis en calculant les sinus à l'aide de Tylor Série
- Quel est exactement le problème avec les Séries de Taylor? Il ressemble exactement à ce dont vous avez besoin. Il vous permet de calculer sin, cos, tan jusqu'à ce que la précision que vous voulez. Si vous avez de la difficulté à la mettre en œuvre, puis de publier que d'une question distincte. Sinon, les gens ont suggéré une table de recherche qui peut être très bon, mais les recherches peuvent être coûteux aussi. Heureusement, la mise en œuvre est si rapide que vous pouvez faire les tests.
- Vous avez vraiment besoin d'expliquer davantage sur ce que vous êtes en utilisant les résultats. Il existe une variété de différentes approches à différents compromis, et en fonction de ce que vous faites, vous pouvez également être en mesure d'éviter entièrement les opérations, l'utilisation SIMD, ou amortir leurs coûts à travers un grand nombre de calculs. Il est impossible de vous conseiller sur microoptimisation sans connaître les détails du code spécifique à microoptimised.
- Pour obtenir un numéro de look-up table) est plus lent que le calcul de la série de Taylor? Et tout le profilage des résultats pour le prouver?
- Que diriez-dectecting le CPU et l'utilisation d'un natif de l'instruction sur un processeur moderne avec une table de recherche ou d'autres code optimisé sur des machines plus anciennes.
- Je suis assez sûr que je l'ai vu la comparaison des articles, mais ne peuvent pas les trouver dès maintenant
- Si vous utilisez le calcul de la distance à des fins de comparaison avec une autre distance, un peu de travail avec le carré de la distance et vous pouvez le faire sans sqrt entièrement.
- Comme je l'ai poser dessus, pouvez-vous expliquer pourquoi vous êtes le calcul de la distance? par exemple, si vous êtes à faire des calculs afin de la comparer avec quelque chose, ne faites pas de la place de la racine carrée de la valeur à comparer avec la place. De même, si vous expliquez ce que vous faites avec sin/cos il y a peut-être des moyens pour éviter ces opérations.
- J'ai besoin de distance exacte, que les au carré de la distance de truc ne peut pas être utilisé dans mon cas
- L'approche habituelle pour la racine carrée est d'obtenir une estimation pour la racine carrée (ou à l'inverse de la racine carrée) à l'aide d'un natif du PROCESSEUR de l'instruction, d'une table de recherche, Carmack la fonction etc, généralement à 1 partie en 64, puis l'utiliser dans de Newton-Raphson jusqu'à ce que vous avez suffisamment de précision (IIRC 4 tours pour plein précision). C'est effectivement ce que la bibliothèque C++ aurez à faire, donc si vous avez besoin d'un résultat exact que les chances sont que l'application que vous utilisez actuellement est déjà optimale et la seule façon d'améliorer serait d'utiliser SIMD (ESS, etc), ou de modification de votre algorithme pour éviter le fonctionnement / de réduire sa fréquence.
- Quand vous posez ce genre de question, vous devez spécifier des conditions beaucoup plus de précision. Avez-vous des informations sur la distribution des numéros pour lesquels vous aurez à calculer sin/cos/sqrt (dire qu'ils sont tous proches de 0)? Avez-vous des contraintes spécifiques sur la précision (par exemple, le péché(0) absolument être 0)? etc. Toute information supplémentaire donne un moyen d'améliorer la solution.
- Des tables pour les fonctions trigonométriques sont rarement une bonne idée sur n'importe quel processeur de ces 15 dernières années. Qu'est-ce que votre spécification minimale? Si votre spécification minimale est un Pentium 4 pensez à activer le SSE2 de génération de code et l'utilisation de l'ESS sqrt intrinsèques. Le moteur d'exécution lien de l'ESS des versions optimisées de fonctions trigonométriques ainsi ce qui peut être assez d'un facteur que vous n'avez pas besoin de chercher plus loin.
- Si la précision est d'aucun intérêt que ce soit, vous pouvez utiliser 0, rapprochant sine, que sa sortie sera dans l'intervalle [-1, 1]. Huhu -- désolé, blague -- juste la vitesse et la précision ont tendance à être liés ensemble, et c'est un peu ambigu quant à quel degré d'approximation est acceptable. Lut ne sont généralement pas si bénéfique ici. J'ai trouvé ces bits tripoter nombre magique des solutions telles que l'id est rapide rsqrt de toujours offrir quelques petits avantages, même si je suis dans le C++03 ère (legacy/plate-forme) et un peu en retard sur la dernière optimiseurs/libs standard. Il y a sin/cos variantes de ces derniers aussi bien.
Vous devez vous connecter pour publier un commentaire.
Le moyen le plus rapide est à pré-calculer les valeurs d'une utilisation d'un tableau comme dans cet exemple:
Créer sine table de recherche en C++
MAIS si vous insistez sur le calcul au moment de l'exécution, vous pouvez utiliser le développement en série de Taylor de l'expansion de sinus ou cosinus...
Pour en savoir plus sur les séries de Taylor... http://en.wikipedia.org/wiki/Taylor_series
L'un des éléments-clés pour obtenir que cela fonctionne bien est pré-calculer les factorielles et les tronquer à un bon nombre de termes. Le factorielles grandir dans le dénominateur très rapidement, de sorte que vous n'avez pas besoin de transporter plus de quelques termes.
Aussi...Ne multipliez pas vos x^n depuis le début à chaque fois...par exemple, multiplier x^3 par x un autre deux fois, alors que par deux pour calculer les exposants.
Tout d'abord, le développement en série de Taylor n'est PAS le meilleur/le plus rapide à mettre en œuvre sinus/cosinus. Il est également pas la façon dont les professionnels des bibliothèques de mise en œuvre de ces fonctions trigonométriques, et de connaître le meilleur numérique de la mise en œuvre permet d'affiner la précision pour obtenir la vitesse de manière plus efficace. En outre, ce problème a déjà été largement discuté dans StackOverflow. Voici juste un exemple.
Deuxième, la grande différence que vous voyez entre les anciens/nouveaux PC est dû au fait que la modernité de l'architecture Intel a explicite de l'assemblée du code pour calculer elementar fonctions trigonométriques. Il est assez difficile de les battre sur la vitesse d'exécution.
Enfin, parlons de ce code sur votre ancien PC. Vérifier gsl gnu scientific library (ou recettes ou numérique) de la mise en œuvre, et vous verrez qu'ils sont fondamentalement utilisation de Tchebychev Approximation de la Formule.
Approximation de Chebyshev converge plus rapidement, de sorte que vous devez évaluer les moins de termes. Je ne vais pas écrire de mise en œuvre en détail ici, car il y a déjà de très belles réponses postées sur StackOverflow. Vérifier celui-ci par exemple . Juste régler le nombre de termes de cette série de modifier l'équilibre entre la précision et de vitesse.
Par la route: de la règle à 0 pour ce genre de problème: si vous voulez des détails de mise en œuvre de certaines de fonction ou de la méthode numérique, vous devriez jeter un oeil sur la GSL code avant toute action - GSL est LA NORME numérique de la bibliothèque.
EDIT: vous pouvez améliorer le temps d'exécution en incluant agressif à virgule flottante options d'optimisation de gcc/icc. Cela permettra de diminuer la précision, mais il semble que c'est exactement ce que vous voulez.
EDIT2: Vous pouvez essayer de faire un gros péché de la grille et utilisez gsl routine (gsl_interp_cspline_periodic pour spline avec des conditions) pour spline de la table (la spline permettra de réduire les erreurs par rapport à une interpolation linéaire => vous avez besoin de moins de points sur votre table => moins de cache miss)!
Ici est la garantie la plus rapide possible de la fonction sinus en C++:
Oh, tu voulais une précision meilleure que |1.0|? Bien lecture sur.
Ingénieurs dans les années 1970, de formidables découvertes dans ce domaine, mais les nouveaux programmeurs sont tout simplement pas au courant que ces méthodes existent, parce qu'ils ne sont pas instruits dans le cadre de la norme en sciences informatiques programmes d'études.
Vous devez commencer par comprendre que il n'est pas "parfait" de la mise en œuvre de ces fonctions pour toutes les applications. Par conséquent, superficielle réponses à des questions comme "qui est le plus rapide" sont garantis d'être mauvais.
La plupart des gens qui posent cette question ne comprennent pas l'importance de la compromis entre performances et précision. En particulier, vous allez avoir à faire des choix quant à l'exactitude des calculs avant de faire quoi que ce soit d'autre. Combien d'erreur pouvez-vous tolérer dans le résultat? 10^-4? 10^-16?
À moins que vous pouvez quantifier l'erreur dans une méthode, ne l'utilisez pas.
Aucune personne n'utilise les séries de Taylor seul à rapprocher des êtres transcendantaux dans le logiciel. À l'exception de certains cas bien spécifiques, la série de Taylor en général l'approche de la cible lentement à travers le commun des gammes d'entrée.
Les algorithmes que vos grands-parents utilisée pour calculer les êtres transcendantaux efficacement, sont désignés collectivement comme CORDIC et ont été assez simple pour être mis en œuvre dans le matériel. Voici une bien documenté CORDIC mise en œuvre en C. CORDIC implémentations, en général, nécessite une très petite table de recherche, mais la plupart des implémentations ne nécessitent même pas de matériel multiplicateur être disponible. La plupart des CORDIC implémentations de vous permettre de traiter des performances de précision, y compris celui que j'ai lié.
Il y a eu beaucoup d'améliorations incrémentales à l'origine CORDIC algorithmes au fil des ans. Par exemple, l'année dernière, des chercheurs au Japon ont publié un l'article sur une amélioration de la CORDIC avec de meilleurs angles de rotation, ce qui réduit les opérations nécessaires.
Si vous avez du matériel multiplicateurs assis autour de (et vous en avez certainement), ou si vous ne pouvez pas se permettre un tableau de recherche comme CORDIC l'exige, vous pouvez toujours utiliser un Polynôme de tchebychev de faire la même chose. Polynômes de tchebychev besoin multiplie, mais c'est rarement un problème sur le matériel moderne. Nous aimons les polynômes de Tchebychev parce que ils ont hautement prévisible erreurs maximales pour un rapprochement. Le maximum de le dernier terme d'un polynôme de Tchebychev, au sein de votre gamme d'entrée, les limites de l'erreur dans le résultat. Et cette erreur est plus petit que le nombre de termes est importante, plus. Voici un exemple d'un polynôme de Tchebychev de donner une condition sine rapprochement à travers une vaste gamme, en ignorant la symétrie naturelle de la fonction sinus et seulement à la résolution des le rapprochement problème en mettant plus de coefficients à elle.
Nous aussi comme les polynômes de Tchebychev, car l'erreur dans l'approximation est également répartie entre les différents résultats. Si vous êtes à l'écriture de plugins audio ou de faire un traitement du signal numérique, polynômes de Tchebychev vous donner un bon marché et prévisible de tramage effet "gratuitement".
Si vous voulez trouver vos propres coefficients du polynôme de Tchebychev à travers une gamme spécifique, de nombreuses bibliothèques de mathématiques appeler le processus de trouver les coefficients "De tchebychev ajustement" ou quelque chose comme ça.
Racines carrées, alors comme aujourd'hui, sont généralement calculées avec une variante de la Algorithme de Newton-Raphson, généralement avec un nombre fixe d'itérations. Habituellement, quand quelqu'un développe un "inédite" algorithme pour faire des racines carrées, il s'agit simplement de Newton-Raphson dans le déguisement.
De Newton-Raphson, CORDIC, et les polynômes de Tchebychev de vous laisser sur le compromis vitesse-précision, de sorte que la réponse peut être tout aussi imprécis que vous le souhaitez.
Enfin, lorsque vous avez terminé tous votre fantaisie d'analyse comparative et de la micro-optimisation, assurez-vous que votre "rapide" est effectivement plus rapide que la version de bibliothèque. Voici un exemple typique de la bibliothèque de la mise en œuvre de la fnis() délimitée sur le domaine de -pi/4, pi/4. Et il n'est tout simplement pas ce maudit lent.
Il y a des gens qui ont consacré leur vie à la résolution de ces problèmes de façon efficace, et ils ont produit quelques résultats fascinants. Lorsque vous êtes prêt à rejoindre la vieille école, ramasser une copie de Numérique Recettes.
tl:dr; go google "sine rapprochement" ou "cosinus rapprochement" ou "racine carrée rapprochement" ou "théorie de l'approximation."
sqrt
instruction est une boîte noire qui crache correctement arrondies sqrt résultats très rapide (par exemple, sur Skylake avec 12 cycle de latence, un par 3 cycle de traitement). Vous ne pouvez pas battre ce avec un Newton-Raphson itération de départ avecrsqrtps
(approx réciproque sqrt). À l'aide de toutrsqrtps
(ce qui donne 12 bits de précision) est plus rapide, ou si vous avez besoin de la racine au lieu de l'inverse,x * approx_rsqrt(x)
est un peu plus rapide quesqrt(x)
.sqrtps
est plus rapide encore quersqrtps
+fmaddps
, parce qu'ilsqrtps
décode à un seul uop (la table de la recherche + de Newton-Raphson qui se passe à l'intérieur de la cloison de l'unité, n'est pas conduit par le microcode qui serait en concurrence avec d'autres instructions pour l'exécution des ressources).sqrt
est spécial parce que c'est l'une des fonctions que la norme IEEE nécessite de produire un correctement, le résultat arrondi, avec + - * /, de sorte qu'il est généralement mis en œuvre dans le matériel.fsqrt
, mais il en faut 70 cycles d'horloge, vs fadd / fmul de 3 cycle de latence. (P5 est une commande de la CPU, mais il peut se chevauchent fsqrt avec entier instructions pour 69 de ces cycles d'horloge, mais seulement par 2 de 70 cycles avec d'autres FP travail). Un rapide approximative sqrt serait certainement utile d'examiner sur P5.FastSine
commeconstexpr
, il sera encore plus rapide.Pour la racine carrée, il y a une approche appelée décalage de bits.
Un nombre à virgule défini par la norme IEEE-754 est à l'aide de certains bits représentent décrire fois de multiples basé sur 2. Certains bits sont pour représenter la valeur de base.
C'est une constante de temps de calcul de la carrés de la racine
i
puis moulagefloat*
avant d'être déréférencé il de nouveau?Basé sur l'idée de http://forum.devmaster.net/t/fast-and-accurate-sine-cosine/9648 et certains manuels de réécriture pour améliorer la performance dans un micro de référence j'ai fini avec la suite de cosinus de mise en œuvre qui est utilisé dans le HPC de simulation physique qui est un goulot d'étranglement par la répétition de cos appels sur un grand nombre de l'espace. C'est assez précis et beaucoup plus vite qu'une table de recherche, et plus particulièrement la division est nécessaire.
Le compilateur Intel, au moins, est également assez intelligent dans la vectorisation de cette fonction dans une boucle.
Si EXTRA_PRECISION est défini, l'erreur maximale est d'environ 0.00109 de la plage -à π π, en supposant
T
estdouble
comme il est généralement défini dans la plupart des C++ implémentations. Sinon, l'erreur maximale est d'environ de 0,056 pour la même gamme.-ffast-math
aide à soulager la question quelque peu. La CPI fait par défaut.Pour les architectures x86, le matériel FP racine carrée instructions sont rapides (
sqrtss
est sqrt Scalaire Simple précision). Simple précision est plus rapide que la double précision, donc certainement utiliserfloat
au lieu dedouble
pour le code où vous pouvez vous permettre d'utiliser moins de précision.Pour les 32 bits de code, vous avez généralement besoin de compilateur options pour l'amener à faire FP mathématiques avec des instructions SSE, plutôt que de x87. (par exemple,
-mfpmath=sse
)Pour obtenir C
sqrt()
ousqrtf()
fonctions inline comme justesqrtsd
ousqrtss
, vous avez besoin de compiler avec-fno-math-errno
. Avoir les fonctions mathématiques ensembleerrno
sur NaN est généralement considérée comme une erreur de conception, mais la norme l'exige. Sans cette option, gcc inlines, mais alors il ne le compare+les branches pour voir si le résultat est NaN, et si oui, appelle une fonction de la bibliothèque alors il peuterrno
. Si votre programme ne vérifie paserrno
après les fonctions mathématiques, il n'y a pas de danger à l'aide de-fno-math-errno
.Vous n'avez pas besoin de "dangereux" pièces de
-ffast-math
pour obtenirsqrt
et quelques autres fonctions inline mieux ou pas du tout, mais-ffast-math
peut faire une grande différence (en permettant par exemple le compilateur à l'auto-vectorisation dans les cas où cela change le résultat, parce que FP mathématiques n'est pas associatif.par exemple avec gcc6.3 compilation
float foo(float a){ return sqrtf(a); }
gcc du code pour l'NaN cas semble bien trop compliqué; il n'a même pas utiliser le
sqrtf
valeur de retour! De toute façon, c'est le genre de dégâts que vous obtenez en fait sans-fno-math-errno
, pour chaquesqrtf()
site d'appel dans votre programme. Surtout que c'est juste du code de ballonnements, et aucun des.L8
bloc sera exécuté lors de la prise de la racine carrée d'un nombre >= 0.0, mais il y a encore plusieurs instructions supplémentaires dans la voie rapide.Si vous savez que votre entrée à
sqrt
est non-zéro, vous pouvez utiliser le rapide mais très approximative réciproque sqrt instruction,rsqrtps
(oursqrtss
pour la version scalaire). Un Newton-Raphson itération le met à peu près la même précision que le matériel de simple précisionsqrt
instruction, mais pas tout à fait.sqrt(x) = x * 1/sqrt(x)
, pourx!=0
, de sorte que vous pouvez calculer une racine carrée avec rsqrt et de se multiplier. Ce sont à la fois rapides, même sur P4 (était-ce toujours d'actualité en 2013)?Sur P4, il peut être utile d'utiliser
rsqrt
+ itération de Newton pour remplacer une seulesqrt
, même si vous n'avez pas besoin de diviser quelque chose en elle.Voir aussi une réponse que j'ai écrit récemment au sujet de la manipulation des zéros lors du calcul de
sqrt(x)
x*rsqrt(x)
, avec une Itération de Newton. J'ai inclus une discussion d'erreur d'arrondi si vous voulez convertir la valeur FP pour un entier, et des liens vers d'autres questions pertinentes.P4:
sqrtss
: 23c temps de latence, pas de pipelinesqrtsd
: 38c temps de latence, pas de pipelinefsqrt
(x87): 43 ° c temps de latence, pas de pipelinersqrtss
/mulss
: 4c + 6c de latence. Peut-être l'un par 3c débit, car ils n'ont apparemment pas besoin de la même unité d'exécution (mmx vs fp).SIMD paniers versions sont un peu plus lentes
Skylake:
sqrtss
/sqrtps
: 12c de latence, un par 3c débitsqrtsd
/sqrtpd
: 15-16c de latence, un par 4-6c débitfsqrt
(x87): 14-21cc de latence, un par 4-7c débitrsqrtss
/mulss
: 4c + 4c temps de latence. Un par 1c débit.rsqrtss
version a plein rendement pour 256b vecteurs.Avec une Itération de Newton, la
rsqrt
version n'est pas beaucoup, si en plus vite.Numéros de Agner de Fog, d'expérimentation, de. Voir son microarch guides de comprendre ce qui rend le code d'une course rapide ou lente. Également voir les liens à la x86 la balise wiki.
IDK la meilleure façon de calculer sin/cos. J'ai lu que le matériel
fsin
/fcos
(et seulement légèrement plus lentefsincos
qui fait les deux à la fois) ne sont pas le moyen le plus rapide, mais IDK ce qui est.QT est rapide implémentations de sinus (qFastSin) et cosinus (qFastCos) qui utilise table avec interpolation. Je l'utilise dans mon code et ils sont plus rapides que std:sin/cos et suffisamment précis pour que ce dont j'ai besoin (erreur ~= 0.01% je dirais):
https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qmath.h.html#_Z8qFastSind
La LUT et la licence peut être trouvé ici: https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qmath.cpp.html#qt_sine_table
J'utilise le code suivant pour calculer les fonctions trigonométriques en quadruple précision. La constante N détermine le nombre de bits de précision requis (par exemple N=26 donnera simple précision). Selon le niveau de précision désiré, le précalculées de stockage peut être petit et tient dans le cache. Il nécessite seulement l'addition et de la multiplication des opérations et est également très facile à vectoriser.
L'algorithme de pré-calcule sin et cos valeurs de 0.5^i, i=1,...,N. on peut Alors combiner ces valeurs précalculées, pour calculer sin et cos pour n'importe quel angle jusqu'à une résolution de 0,5^N
C'est une implémentation de la Série de Taylor de la méthode précédemment donné en akellehe réponse.
Sur 100000000 test, milianw réponse est 2 fois plus lent que std::cos mise en œuvre.
Cependant, vous pouvez gérer l'exécuter plus rapidement en faisant les étapes suivantes:
->utiliser float
->ne pas utiliser de l'étage, mais static_cast
->n'utilisez pas d'abs mais ternaire conditionnelle
->utiliser des #define constante pour la division
->utilisation de la macro pour éviter l'appel de fonction
Sur 100000000 appel à std::cos et _ des _cos(x), std::cos exécuter sur ~14s vs ~3s pour _ des _cos(x) (un peu plus pour _sin(x))
Partage mon code, c'est un 6ème polynomiale de degré, rien de spécial, mais disposés de façon à éviter
pow
s. Sur Core i7 c'est 2,3 fois plus lente que celle de la mise en œuvre, bien qu'un peu plus vite pour [0..2*PI] gamme. Pour un vieux processeur, cela pourrait être une alternative à la norme sin/cos.Alors permettez-moi de reformuler ce que, cette idée vient de rapprocher les cosinus & sinus fonctions sur un intervalle [-pi/4,+pi/4], délimitée à l'erreur à l'aide de l'algorithme de Remez. Ensuite, à l'aide de la gamme réduite flotteur reste et une LUT pour les sorties cos & sinus de l'quotient entier, le rapprochement peut être déplacé à n'importe quel angulaire argument.
Son tout à fait unique et j'ai pensé qu'il pourrait être élargi de manière à faire un algorithme plus efficace en termes de bornée erreur.