313 votes

Comment est-ce que C calculer sin() et autres fonctions mathématiques?

J'ai été parcourt .NET disassemblies et le code source de GCC, mais impossible de le trouver nulle part la mise en œuvre effective de l' sin() et d'autres fonctions mathématiques... ils semblent toujours faire référence à quelque chose d'autre.

Quelqu'un peut-il m'aider à les retrouver? Je me sens comme il est peu probable que TOUT le matériel que C sera exécuté sur soutient les fonctions trigonométriques dans le matériel, donc il doit y avoir un algorithme logiciel quelque part, non?

Edit: je suis au courant de plusieurs façons dont les fonctions peuvent être calculés, et ont écrit mes propres routines pour calculer des fonctions à l'aide de la série de taylor pour le plaisir. Je suis curieux de savoir comment réel, production langues, étant donné que toutes mes applications sont toujours de plusieurs ordres de grandeur plus lent, même si je pense que mon algorithmes sont assez intelligents (évidemment ils ne le sont pas).

282voto

Jason Orendorff Points 15869

Dans GNU libm, la mise en œuvre de l' sin est totalement dépendant du système. Par conséquent, vous pouvez trouver la mise en œuvre, pour chaque plate-forme, quelque part dans le sous-répertoire approprié de sysdeps.

Un seul de ces répertoires semble inclure une implémentation en C. Il a été fourni par IBM et semble difficile à suivre. Dans certaines régions, il utilise le familier de la série de Taylor, mais il y a énormément de code. Source: sysdeps/ieee754/dbl-64/s_sin.c

La version pour les processeurs Intel x 86 est écrit dans l'assemblée. Il utilise simplement la FPU intégré dans l' fsin enseignement. Source: sysdeps/i386/fpu/s_sin.S

fdlibm mise en œuvre de l' sin pure C est beaucoup plus simple que de glibc et est très bien commenté. Source: fdlibm/s_sin.c et fdlibm/k_sin.c

79voto

John D. Cook Points 19036

Comme les fonctions sinus et cosinus sont mis en œuvre dans le microcode à l'intérieur de microprocesseurs. Puces d'Intel, par exemple, ont des instructions de montage pour ces. Le compilateur va générer du code qui appelle ces instructions de montage. (En revanche, un compilateur Java ne sera pas. Java évalue les fonctions trigonométriques dans le logiciel plutôt que matériel, et donc il s'exécute beaucoup plus lentement.)

Les frites ne pas utiliser la série de Taylor pour calculer les fonctions trigonométriques, du moins pas entièrement. Tout d'abord, ils utilisent CORDIC, mais ils peuvent également utiliser d'une courte série de Taylor de peaufiner le résultat de CORDIC ou pour des cas particuliers tels que le calcul de sinus avec une haute précision relative aux très petits angles. Pour plus d'explication, voir ce StackOverflow réponse.

69voto

Donald Murray Points 229

OK les gosses, le temps pour les pros.... C'est l'une de mes plus grandes plaintes inexpérimenté ingénieurs en logiciel. Ils viennent dans le calcul de fonctions transcendantes à partir de zéro (à l'aide de séries de Taylor), comme si personne n'avait jamais fait ces calculs avant dans leur vie. Pas vrai. Il s'agit d'un problème défini et a été abordé des milliers de fois par de très habiles ingénieurs logiciels et matériels, et a une solution. Fondamentalement, la plupart des fonctions transcendantes utiliser les Polynômes de Tchebychev pour les calculer. Qui polynômes sont utilisés dépend des circonstances. Tout d'abord, la bible à ce sujet est un livre qui s'appelle "Ordinateur Approximations" par Hart et Cheney. Dans le livre, vous pouvez décider si vous avez un matériel additionneur, multiplicateur de, diviseur, etc, et de décider quelles activités sont les plus rapides. par exemple, Si vous aviez un très rapide diviseur, le moyen le plus rapide pour calculer le sinus peut être P1(x)/P2(x) où P1, P2 sont des polynômes de Chebyshev. Sans la rapide diviseur, il pourrait être juste P(x), où P est beaucoup plus que de la P1 ou P2....de sorte qu'il serait plus lent. Donc, la première étape est de déterminer votre matériel et ce qu'il peut faire. Ensuite, à vous de choisir la combinaison appropriée de polynômes de Tchebychev (est généralement de la forme cos(ax) = aP(x) pour le cosinus par exemple, si P est un polynôme de Tchebychev). Ensuite, vous décidez de ce que la précision décimale vous le souhaitez. par exemple, si vous voulez que 7 chiffres de précision, vous le cherchez dans le tableau approprié dans le livre que j'ai mentionné, et il vous donnera (pour la précision = 7.33) un nombre N = 4 et un polynôme nombre 3502. N est le degré du polynôme (c'est p4.x^4 + p3.x^3 + p2.x^2 + p1.x + p0), parce que N=4. Ensuite, vous regardez en haut de la valeur réelle de la p4,p3,p2,p1,p0 valeurs dans le dos de l'ouvrage en vertu de l'3502 (ils vont être en virgule flottante). Ensuite, vous mettez en œuvre votre algorithme dans le logiciel sous la forme: (((p4.x + p3).x + p2).x + p1).x + p0 ....et c'est comment vous pouvez calculer le cosinus à 7 décimales sur ce matériel.

Notez que la plupart du matériel implémentations transcendantale des opérations dans une FPU impliquent généralement certains de microcode et des opérations de ce genre (dépend du matériel). Polynômes de tchebychev sont utilisés pour la plupart des êtres transcendantaux, mais pas tous. par exemple, la racine Carrée est plus rapide d'utiliser un double itération de Newton-raphson la méthode à l'aide d'une table de recherche en premier. Encore une fois, le livre de l'Ordinateur "Approximations", vous diront que.

Si vous prévoyez sur implmementing ces fonctions, je le recommande à toute personne qu'ils obtiennent une copie de ce livre. C'est vraiment la bible pour ces types d'algorithmes. Notez qu'il existe des bouquets de moyens alternatifs pour le calcul de ces valeurs comme cordics, etc, mais ils ont tendance à être mieux pour des algorithmes spécifiques où vous avez seulement besoin d'une faible précision. Pour garantir la précision à chaque fois, les polynômes de tchebychev sont la voie à suivre. Comme je l'ai dit, bien défini problème. A été résolu depuis maintenant 50 ans.....et c'est comment il est fait.

Maintenant, cela étant dit, il y a des techniques par lesquelles les polynômes de Chebyshev peut être utilisée pour obtenir un seul résultat de précision avec un faible degré de polynôme (comme dans l'exemple pour le cosinus ci-dessus). Ensuite, il existe d'autres techniques d'interpolation entre les valeurs pour augmenter la précision, sans avoir à passer à un bien plus grand polynôme, tels que "Gal Précis de Tables de Méthode". Cette dernière technique est ce que le post se référant à l'ACM de la littérature se réfère. Mais en fin de compte, les Polynômes de Tchebychev sont ce qui sont utilisés pour obtenir 90% du chemin.

Profitez de.

14voto

Mehrdad Afshari Points 204872

Oui, il existe des logiciels d'algorithmes pour le calcul des sin trop. Fondamentalement, le calcul de ces genre de choses avec un ordinateur numérique se fait généralement à l'aide de méthodes numériques comme le rapprochement de la série de Taylor représentant la fonction.

Méthodes numériques peut approximer des fonctions à une quantité arbitraire de précision et que le montant de la précision que vous avez dans un nombre flottant est fini, ils répondent aux besoins de ces tâches assez bien.

11voto

Thomas Pornin Points 36984

C'est une question complexe. Intel-comme PROCESSEUR de la famille x86 ont un matériel de mise en œuvre de l' sin() de la fonction, mais fait partie de la FPU x87 et pas plus utilisé en mode 64 bits (où SSE2 registres sont utilisés à la place). Dans ce mode, logiciel mise en œuvre est utilisée.

Il en existe plusieurs implémentations. On est dans fdlibm et est utilisé en Java. Autant que je sache, la glibc mise en œuvre comprend des pièces de fdlibm, et d'autres pièces ont contribué par IBM.

L'implantation d'un logiciel de fonctions transcendantes comme sin() utilisent généralement des approximations par des polynômes, souvent obtenus à partir de la série de Taylor.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X