Ich möchte die Antwort von @Jason S erweitern. Unter Verwendung einer Domain-Unterteilungsmethode, die der von @Jason S beschriebenen ähnelt, und unter Verwendung von Maclaurin-Reihen-Approximationen, einer durchschnittlichen (2-3) X-Beschleunigung über tan (), sin () Die im gcc-Compiler mit -O3-Optimierung integrierten Funktionen cos,), atan (), asin () und acos () wurden erreicht. Die unten beschriebenen besten Approximationsfunktionen der Maclaurin-Serie erreichten eine doppelte Genauigkeit.
Für die Funktionen tan (), sin () und cos () und der Einfachheit halber wurde eine überlappende Domäne von 0 bis 2 pi + pi / 80 in 81 gleiche Intervalle mit "Ankerpunkten" bei pi / 80, 3 pi / 80, unterteilt. ..., 161pi / 80. Dann wurden tan (), sin () und cos () dieser 81 Ankerpunkte ausgewertet und gespeichert. Mit Hilfe von Triggeridentitäten wurde für jede Triggerfunktion eine einzelne Maclaurin-Serienfunktion entwickelt. Jeder Winkel zwischen ± unendlich kann an die Trigger-Approximationsfunktionen übergeben werden, da die Funktionen zuerst den Eingabewinkel in die Domäne von 0 bis 2 pi übersetzen. Dieser Übersetzungsaufwand ist im Approximationsaufwand enthalten.
Ähnliche Methoden wurden für die Funktionen atan (), asin () und acos () entwickelt, bei denen eine überlappende Domäne von -1,0 bis 1,1 in 21 gleiche Intervalle mit Ankerpunkten bei -19/20, -17/20, .. unterteilt wurde. ., 19/20, 21/20. Dann wurde nur atan () dieser 21 Ankerpunkte gespeichert. Wiederum wurde mit Hilfe inverser Triggeridentitäten eine einzelne Maclaurin-Reihenfunktion für die atan () -Funktion entwickelt. Die Ergebnisse der atan () -Funktion wurden dann verwendet, um asin () und acos () zu approximieren.
Da alle inversen Trigger-Approximationsfunktionen auf der atan () -Näherungsfunktion basieren, ist jeder Argument-Eingabewert mit doppelter Genauigkeit zulässig. Das Argument, das in die Näherungsfunktionen asin () und acos () eingegeben wird, wird jedoch auf die Domäne ± 1 abgeschnitten, da jeder Wert außerhalb davon bedeutungslos ist.
Um die Approximationsfunktionen zu testen, mussten eine Milliarde zufällige Funktionsbewertungen ausgewertet werden (das heißt, der -O3-Optimierungscompiler durfte die Auswertung nicht umgehen, da ein berechnetes Ergebnis nicht verwendet wurde.) Um die Verzerrung bei der Auswertung einer Milliarde zu beseitigen Zufallszahlen und Verarbeitung der Ergebnisse, die Kosten eines Laufs ohne Auswertung einer Trigger- oder inversen Triggerfunktion wurden zuerst durchgeführt. Diese Vorspannung wurde dann von jedem Test abgezogen, um eine repräsentativere Annäherung an die tatsächliche Funktionsbewertungszeit zu erhalten.
Tabelle 2. Zeitaufwand in Sekunden für die Ausführung der angegebenen Funktion oder Funktionen eine Milliarde Mal. Die Schätzungen werden erhalten, indem die Zeitkosten für die Auswertung einer Milliarde Zufallszahlen, die in der ersten Zeile von Tabelle 1 gezeigt sind, von den verbleibenden Zeilen in Tabelle 1 subtrahiert werden.
Zeit in tan () verbracht: 18.0515 18.2545
In TAN3 () verbrachte Zeit: 5.93853 6.02349
In TAN4 () verbrachte Zeit: 6.72216 6.99134
Zeit in sin () und cos (): 19.4052 19.4311
In SINCOS3 () verbrachte Zeit: 7.85564 7.92844
In SINCOS4 () verbrachte Zeit: 9.36672 9.57946
Zeit in atan () verbracht: 15.7160 15.6599
In ATAN1 () verbrachte Zeit: 6.47800 6.55230
In ATAN2 () verbrachte Zeit: 7.26730 7.24885
In ATAN3 () verbrachte Zeit: 8.15299 8.21284
Zeitaufwand in asin () und acos (): 36.8833 36.9496
In ASINCOS1 () verbrachte Zeit: 10.1655 9.78479
In ASINCOS2 () verbrachte Zeit: 10.6236 10.6000
In ASINCOS3 () verbrachte Zeit: 12.8430 12.0707
(Um Platz zu sparen, ist Tabelle 1 nicht dargestellt.) Tabelle 2 zeigt die Ergebnisse von zwei getrennten Läufen von einer Milliarde Bewertungen jeder Näherungsfunktion. Die erste Spalte ist der erste Lauf und die zweite Spalte ist der zweite Lauf. Die Zahlen '1', '2', '3' oder '4' in den Funktionsnamen geben die Anzahl der Begriffe an, die in der Maclaurin-Reihenfunktion verwendet werden, um den bestimmten Trigger oder die inverse Trigger-Approximation zu bewerten. SINCOS # () bedeutet, dass sowohl sin als auch cos gleichzeitig ausgewertet wurden. Ebenso bedeutet ASINCOS # (), dass sowohl Asin als auch Acos gleichzeitig bewertet wurden. Die gleichzeitige Bewertung beider Mengen ist mit wenig zusätzlichem Aufwand verbunden.
Die Ergebnisse zeigen, dass eine Erhöhung der Anzahl der Begriffe die Ausführungszeit erwartungsgemäß geringfügig verlängert. Selbst die kleinste Anzahl von Termen ergab überall eine Genauigkeit von 12 bis 14 Stellen, mit Ausnahme der tan () - Näherung nahe der Stelle, an der sich ihr Wert ± unendlich nähert. Man würde erwarten, dass sogar die tan () - Funktion dort Probleme hat.
Ähnliche Ergebnisse wurden auf einem High-End-MacBook Pro-Laptop unter Unix und auf einem High-End-Desktop-Computer unter Linux erzielt.