Frage

So in der High School Mathematik und wahrscheinlich College, werden wir lernen, wie man trigonometrische Funktionen verwenden, was sie tun, und welche Arten von Problemen, die sie zu lösen. Aber sie haben mir immer als eine Black Box präsentiert. Wenn Sie den Sinus oder Cosinus von etwas benötigen, schlagen Sie die sin oder cos-Taste auf Ihrem Rechner und Sie werden eingestellt. Welches ist in Ordnung.

Was ich frage mich, wie trigonometrische Funktionen sind in der Regel umgesetzt werden.

War es hilfreich?

Lösung

Als erstes müssen Sie irgendeine Art von Bereich Reduktion zu tun. Trigonometrische Funktionen sind periodisch, so müssen Sie Argumente reduzieren bis zu einem Standardintervall. Für den Anfang können Sie Winkel reduzieren, die zwischen 0 und 360 Grad liegt. Aber nach ein paar Identitäten verwenden, merkt man mit weniger auskommen könnte. Wenn Sie Sinus und Cosinus für Winkel zwischen 0 und 45 Grad zu berechnen, können Sie Bootstrap Weg alle trigonometrischen Funktionen für alle Winkel zu berechnen.

Wenn Sie Ihr Argument reduziert haben, verwenden die meisten Chips ein CORDIC Algorithmus, um die Sinus- zu berechnen und Cosinus. Sie hören die Leute sagen, dass Computer Taylor-Reihe verwenden. Das klingt vernünftig, aber es ist nicht wahr. Die CORDIC-Algorithmen sind viel besser geeignet, um eine effiziente Hardware Implementierung. ( Software Bibliotheken können Taylor-Reihe verwenden, sagen auf Hardware, die nicht trigonometrische Funktionen nicht unterstützt.) Es kann eine gewisse zusätzliche Verarbeitung sein, den CORDIC-Algorithmus ziemlich gute Antworten zu bekommen, aber dann anderes zu tun, etwas zu verbessern Richtigkeit.

Es gibt einige Verbesserungen an den oben genannten. Zum Beispiel für sehr kleinen Winkel Theta (in Radianten), sin (theta) = Theta aller Präzision auch Sie haben, so ist es effizienter, einfach zu zurückgeben Theta als einen anderen Algorithmus zu verwenden. So in der Praxis gibt es viele Sonderfall Logik die Leistung aller und mögliche Genauigkeit herauszupressen. Chips mit kleineren Märkten möglicherweise nicht so viel Optimierungsaufwand gehen.

Andere Tipps

edit: Jack Ganssle hat eine gute Diskussion in seinem Buch über eingebettete Systeme, "Die Firmware Handbook ".

Zur Info: Wenn Sie Genauigkeit und Leistungseinschränkungen, sollte Taylorreihe nicht für numerische Zwecke ungefähre Funktionen verwendet werden. (Save für Ihre Calculus Kurse.) Sie Nutzung des Analytizitat einer Funktion an einem einzigen Punkt , zB die Tatsache, dass alle seine Derivate zu diesem Zeitpunkt existieren. Sie müssen nicht im Intervall von Interesse konvergieren. Oft haben sie einen lausigen Job zu verteilen, die Genauigkeit des Funktionsapproximation um „perfekt“ direkt neben dem Bewertungspunkt zu sein; der Fehler im Allgemeinen zoomt nach oben, wie Sie von ihm weg erhalten. Und wenn Sie eine Funktion mit jedem nicht-kontinuierliche Ableitung haben (zum Beispiel Rechteckwellen, Dreieckwellen und ihre Integrale), eine Taylor-Reihe gibt Ihnen die falsche Antwort.

Die beste "easy" Lösung, wenn ein Polynom maximalen Grad N unter Verwendung eine gegebene Funktion f (x) über ein Intervall x0 Chebyshev Approximation ; siehe Numerical Recipes für eine gute Diskussion. Beachten Sie, dass die Tj (x) und Tk (x) im Wolfram Artikel I verknüpft die cos und inverse Kosinus verwendet, sind diese Polynome und in der Praxis verwenden Sie eine Rekursionsformel, die Koeffizienten zu erhalten. Auch hier sieht Numerical Recipes.

edit: Wikipedia hat einen halbwegs anständigen Artikel über Approximationstheorie . Eine der Quellen, die sie zitieren (Hart, „Computer Annäherungen“) ist vergriffen (& gebrauchte Exemplare sind in der Regel teuer sein), sondern geht in eine Menge von Details über Sachen wie diese. (Jack Ganssle erwähnt dies in der Ausgabe 39 von seinem Newsletter The Muse Embedded .)

bearbeiten 2: Hier einige greifbare Fehlermaße (siehe unten) für Taylor vs. Chebyshev für sin (x). Einige wichtige Punkte zu beachten:

  1. , dass der maximale Fehler einer Taylor-Reihen-Näherung über einen bestimmten Bereich, ist viel größer als der maximale Fehler einer Chebyshev Angleichung des in gleichem Maße. (Für etwa den gleichen Fehler, können Sie mit einem weniger Begriff mit Chebyshev wegkommen, die schnellere Leistung bedeutet)
  2. Bereich Reduktion ist ein großer Gewinn. Dies liegt daran, der Beitrag der Polynome höherer Ordnung schrumpft, wenn das Intervall der Annäherung kleiner ist.
  3. Wenn Sie nicht weg mit einer Reichweite Reduktion erhalten können, müssen Sie Ihre Koeffizienten mit mehr Genauigkeit gespeichert werden.

Verstehen Sie mich nicht falsch: Taylor-Reihe wird richtig für Sinus / Cosinus arbeitet (mit hinreichender Genauigkeit für den Bereich -pi / 2 bis + pi / 2, technisch, mit genug Bedingungen können Sie jede gewünschte Genauigkeit für alle erreichen echte Eingänge, sondern versuchen, cos (100) unter Verwendung von Taylor-Reihe zu berechnen und Sie können es nicht tun, wenn Sie beliebige Genauigkeit arithmetische verwenden). Wenn ich auf einer einsamen Insel mit einem nicht-wissenschaftlichen Rechner steckten, und ich brauchte Sinus- und Cosinus zu berechnen, würde ich wahrscheinlich Taylor-Reihe verwenden, da die Koeffizienten leicht zu merken sind. Aber die realen Anwendungen für mit Ihrem eigenen sin () oder cos () Funktionen schreiben sind selten genug, dass man am besten sein würde eine effiziente Implementierung off mit einer gewünschten Genauigkeit zu erreichen - das ist die Taylor-Reihe nicht .

Bereich = -pi / 2 bis + pi / 2, Grad 5 (3 Begriffe)

  • Taylor: max Fehler rund um 4.5E-3, f (x) = x-x 3 / 6 + x 5 / 120
  • Chebyshev: max Fehler rund 7e-5, f (x) = 0.9996949x-0.1656700x 3 + 0.0075134x 5

Bereich = -pi / 2 bis + pi / 2 Grad 7 (4 Begriffe)

  • Taylor: max Fehler rund um 1,5E-4, f (x) = x-x 3 / 6 + x 5 / 120-x 7 / 5040
  • Chebyshev: max Fehler rund 6E-7, F (x) = 0.99999660x-0.16664824x 3 + 0.00830629x 5 -0.00018363x 7

Bereich = -pi / 4 bis + pi / 4, Grad 3 (2 Begriffe)

  • Taylor: max Fehler rund um 2.5E-3, f (x) = x-x 3 / 6
  • Chebyshev: max Fehler rund um 1,5E-4, f (x) = 0.999x-0.1603x 3

Bereich = -pi / 4 bis + pi / 4, 5 Grad (3 Begriffe)

  • Taylor: max Fehler rund um 3.5E-5, f (x) = x-x 3 / 6 + x 5
  • Chebyshev: max Fehler rund 6E-7, F (x) = 0.999995x-0.1666016x 3 + 0.0081215x 5

Bereich = -pi / 4 bis + pi / 4, 7 Grad (4 Begriffe)

  • Taylor: max Fehler rund 3e-7, f (x) = xx 3 / 6 + x 5 / 120-x 7 / 5040
  • Chebyshev: max Fehler rund um 1.2e-9, F (x) = 0.999999986x-0.166666367x 3 + 0.008331584x 5 -0.000194621x 7

Ich glaube, sie berechnet Taylor Series mit oder CORDIC . Einige Anwendungen, die starke Nutzung von trigonometrischen Funktionen machen (Spiele, Grafiken) konstruieren trig Tabellen, wenn sie beginnen, so können sie nur Werte nachschlagen, anstatt sie über neu zu berechnen und über.

Schauen Sie sich Wikipedia-Artikel auf trigonometrischen Funktionen. Ein guter Ort, um zu erfahren, sie tatsächlich in Code Implementierung ist Numerical Recipes .

Ich bin nicht viel von einem Mathematiker, aber mein Verständnis davon, wo sin, cos, tan und „kommt aus“ ist, dass sie in einem gewissen Sinne, beobachtet, wenn Sie mit dem rechten Winkel Dreiecken arbeiten sind. Wenn Sie Messungen der Längen der Seiten eines Bündels von verschiedenen rechtwinkliger Dreiecke nehmen und die Punkte auf einem Diagramm zeichnen, können Sie sin, cos erhalten, und tan aus, dass. Als Harper Shelby weist darauf hin, werden die Funktionen einfach als Eigenschaften von Dreiecken im rechten Winkel definiert.

Ein differenzierteres Verständnis wird durch das Verständnis erreicht, wie diese Verhältnisse auf die Geometrie des Kreises beziehen, die in Radianten und all das Güte führt. Es ist alles da in dem Wikipedia-Eintrag.

Am häufigsten für Computer, Potenzreihendarstellung wird verwendet, Sinus und Cosinus zu berechnen und diese für andere trigonometrischen Funktionen verwendet. Die Erweiterung dieser Reihe, um etwa 8 berechnet die Begriffe auf eine Genauigkeit der Nähe der Maschine epsilon benötigten Werte (kleinste Nicht-Null-Gleitkommazahl, die gehalten werden kann).

Die CORDIC Methode ist schneller, da sie auf Hardware implementiert ist, aber es ist für Embedded-Systeme und nicht die Standard-Computer eingesetzt.

Ich mag die von @ Jason S. bereitgestellt Antwort erweitern, um ein Domain-Unterteilungsverfahren unter Verwendung ähnlich zu dem von @ Jason S und mit Maclaurin Serie Annäherungen, ein Mittelwert (2-3) X Speedup über den tan (), sin (), cos (), atan (), asin () und acos () in den gcc-Compiler gebaut Funktionen mit O3-Optimierung erreicht. Die beste Maclaurin Serie annähert Funktionen unter doppelter Genauigkeit Genauigkeit erreicht beschrieben.

Für das tan (), sin () und cos () Funktionen, und der Einfachheit halber eine überlappende 0 bis 2 pi + pi / 80 Domäne wurde in 81 gleiche Intervalle unterteilt mit "Ankerpunkte" bei pi / 80, 3pi / 80, ..., 161pi / 80. Dann tan (), sin () und cos () dieser 81 Ankerpunkte wurden ausgewertet und gespeichert. Mit Hilfe von trigonometrischen Identitäten wurde eine einzelne Maclaurin Serie Funktion für jede trigonometrische Funktion entwickelt. Jeder Winkel zwischen ± unendlich kann die trig Annähern Funktionen vorgelegt werden, da die Funktionen zunächst die Eingangswinkel zu 2pi Domäne zum 0 übersetzen. Diese Übersetzung Overhead ist in der Annäherung Kopf enthält.

ähnliche Methoden wurden für die atan () entwickelt, asin () und acos () -Funktionen, wo eine Überlappung -1,0 bis 1,1 Domäne in 21 gleiche Abstände mit Ankerpunkten bei -19/20 geteilt wurde, -17/20 , ..., 19/20, 21/20. Dann nur atan () dieser 21 Ankerpunkte wurde gespeichert. Auch mit Hilfe von inversen trigonometrischen Identitäten wurde eine einzelne Maclaurin Serie Funktion für die atan () Funktion entwickelt. Die Ergebnisse der atan () Funktion wurden dann verwendet, asin () und acos annähert ().

Da alle inversen trigonometrischen Funktionen Annähern an der atan () Näherungsfunktion basieren, jede mit doppelter Genauigkeit Argument Eingangswert erlaubt. Jedoch das Argument Eingang an den asin () und acos () Approximieren Funktionen abgeschnitten zu der ± 1-Domäne, weil jeder beliebigen Wert außerhalb bedeutungslos ist.

die annähernden Funktionen zu testen, eine Milliarde Zufallsfunktion Auswertungen wurden ausgewertet werden gezwungen (das heißt, wurde der O3 Optimierung Compiler erlaubt nicht etwas Auswertung zu umgehen, weil einige berechnete Ergebnis nicht verwendet werden würde.) Die Vorspannung der entfernen Auswertung wurde zuerst eine Milliarde Zufallszahlen und die Verarbeitung der Ergebnisse, die Kosten für einen Lauf ohne Auswertung beliebige TRIG oder inverse trigonometrische Funktion durchgeführt. Diese Vorspannung wurde dann jeden Test subtrahiert off eine repräsentativere Annäherung der tatsächlichen Funktionsauswertungszeit zu erhalten.

Tabelle 2. Die Zeit, in Sekunden, um die angegebene Funktion oder Funktionen eine Milliarde Mal ausgeführt wird. Die Schätzwerte werden erhalten, indem die Zeit, Kosten des Subtrahieren eine Milliarde Zufallszahl Auswerten 1 in der ersten Zeile der Tabelle 1 von den verbleibenden Zeilen in der Tabelle gezeigt.

Die Zeit, in tan (): 18,0515 18,2545

Die Zeit, in TAN3 (): 5,93853 6,02349

Die Zeit, in TAN4 (): 6,72216 6,99134

Die Zeit in Sünde ausgegeben () und cos (): 19,4052 19,4311

Die Zeit, in SINCOS3 (): 7,85564 7,92844

Die Zeit, in SINCOS4 (): 9,36672 9,57946

Zeit in atan ausgegeben (): 15,7160 15,6599

Die Zeit, in ATAN1 (): 6,47800 6,55230

Die Zeit, in ATAN2 (): 7,26730 7,24885

Die Zeit, in ATAN3 (): 8,15299 8,21284

Zeit in asin ausgegeben () und acos (): 36,8833 36,9496

Die Zeit, in ASINCOS1 (): 10,1655 9,78479

Die Zeit, in ASINCOS2 (): 10,6236 10,6000

Die Zeit, in ASINCOS3 (): 12,8430 12,0707

(Im Interesse der Platzersparnis, Tabelle 1 ist nicht gezeigt.) Tabelle 2 zeigt die Ergebnisse von zwei getrennten Läufen von einer Milliarde Evaluationen jeder annähernden Funktion. Die erste Spalte ist der erste Durchlauf und die zweite Spalte ist der zweite Durchlauf. Die Zahlen ‚1‘, ‚2‘, ‚3‘ oder ‚4‘ in den Funktionsnamen geben die Anzahl der Terme in der Reihe Maclaurinschen Funktion verwendet, um die besondere TRIG oder inverse trigonometrische Näherung auszuwerten. SINCOS # () bedeutet, dass sowohl sin und cos zugleich ausgewertet wurden. Ebenso bedeutet ASINCOS # () beide asin und acos bewerten warend zur gleichen Zeit. Es gibt wenig zusätzlichen Aufwand, beiden Mengen zur gleichen Zeit bei der Auswertung.

Die Ergebnisse zeigen, dass die Anzahl der Begriffe zunehmende Ausführungszeit leicht erhöht, wie zu erwarten wäre. Selbst die kleinste Anzahl von Begriffen gab um 12-14 stellige Genauigkeit überall mit Ausnahme der tan () Annäherung in der Nähe, wo sein Wert annähert ± unendlich. Man würde erwarten, auch die tan () Funktion Probleme dort haben.

ähnliche Ergebnisse wurden auf einem High-End-MacBook Pro Laptop in Unix erhalten und auf einem High-End-Desktop-Computer unter Linux.

Wenn Ihr für eine physikalische Erklärung von sin, cos zu fragen, und tan überlegen, wie sie rechtwinkliger Dreiecke beziehen sich auf. Der tatsächliche numerische Wert von cos (lambda) kann durch Bildung eines rechtwinkligen Dreiecks mit einer der Winkel ist, lambda und Dividieren der Länge der Dreiecke benachbarten Seite lambda durch die Länge der Hypotenuse gefunden werden. Ähnlich für sin der gegenüberliegenden Seite durch die Hypotenuse geteilt verwenden. Für Tangens verwenden, um die gegenüberliegende Seite von der benachbarten Seite unterteilt. Der klassische memonic dies zu erinnern ist SOHCAHTOA (sprich socatoa).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top