Hier noch die versprochenen Ergebnisse für die Approximation von sin in [0,pi)
über Lookup Tables und Interpolation.
Ergebnisse für lineare Interpolation mit der angegebenen Zahl von
linearen Teilstücken (Zahl der äquidistanten Stützpunkte zur Ermittlung
der Teilstücke ist um 1 höher als die angegebene Zahl):
Größe | RMSE | MaxAbsErr |
---|
1 | 0.707107 | 1 |
2 | 0.150877 | 0.210514 |
4 | 0.0392843 | 0.0703776 |
8 | 0.00992092 | 0.0188463 |
16 | 0.0024865 | 0.0047921 |
32* | 0.000622018 | 0.00120309 |
64 | 0.000155529 | 0.000301091 |
128 | 3.88838e-05 | 7.52925e-05 |
256 | 9.72104e-06 | 1.88244e-05 |
512 | 2.43027e-06 | 4.70617e-06 |
1024** | 6.07567e-07 | 1.17655e-06 |
2048 | 1.51892e-07 | 2.94137e-07 |
4096 | 3.79729e-08 | 7.35343e-08 |
8192 | 9.49324e-09 | 1.83836e-08 |
* besser als Bhaskara
** besser als Fast Padé Approximation in JUCE
(Alle Berechnungen mit double-Genauigkeit. Referenzwerte von std::sin in C++, MVSC 2019).
Bei linearer Interpolation (und wenn nur Zweierpotenzen als Größe betrachtet werden!) braucht man
also eine Table mit 32 Einträgen, um die Qualität der Bhaskara-Approximation zu übertreffen,
und man braucht 1024 Einträge, um die Qualität der JUCE Fast Approximation zu schlagen.
Hier nun die Ergebnisse für kubische Splines (auch wieder unter Verwendung von äquidistanten Teilstücken):
#Splines | RMSE | MaxAbsErr |
---|
1 | 0.135711 | 0.214602 |
2 | 0.00685208 | 0.0107907 |
4* | 0.00044199 | 0.000906216 |
8 | 2.78424e-05 | 6.05856e-05 |
16** | 1.74357e-06 | 3.84958e-06 |
32 | 1.09026e-07 | 2.41588e-07 |
64 | 6.81499e-09 | 1.51147e-08 |
128 | 4.2595e-10 | 9.44912e-10 |
256 | 2.66221e-11 | 5.90609e-11 |
512 | 1.66389e-12 | 3.69149e-12 |
1024 | 1.04e-13 | 2.30815e-13 |
2048 | 6.50787e-15 | 1.45439e-14 |
4096 | 4.28911e-16 | 1.11022e-15 |
8192 | 1.19571e-16 | 7.77156e-16 |
Bei Interpolation mit kubischen Splines (und wenn wieder nur Zweierpotenzen als Größe betrachtet werden)
genügt eine Table mit 4 Splines, um die Qualität der Bhaskara-Approximation zu übertreffen.
Mit 16 Splines schlägt man die Qualität der JUCE Fast Approximation.
Die Qualität, die die lineare Interpolation in der Tabelle darüber mit 8192 Einträgen erreicht, schafft
man mit 64 Splines.
Für noch noch größere Spline-Zahlen erreicht man eine absurde Genauigkeit mit Abweichungen im
Bereich der 16. Dezimalstelle.
Sofern man die 4 Koeffizienten zur Beschreibung eines kubischen Splines vorberechnet hat,
braucht man zum Lookup in der Table und zur Auswertung 4 Multiplikationen, 3 Additionen
und eine Anwendung von modf (Auftrennung in ganzzahligen Anteil und Nachkommastellen).
Das sind deutlich weniger Operationen als zur Ermittlung des Padé approximants in JUCE,
dafür muss man aber einmal den zu verwendenden Spline aus der Table auslesen.
@mooncast:
Wenn Du mir deine Formel in einer lesbaren Form gibst, teste ich dafür gerne auch
noch die Genauigkeit. Ich habe keine Kapazitäten, mich in die Faust-Darstellung einzudenken.
Und es kann auch gern wieder zum Thema counter-basierte RNG geschrieben werden!
(Allerdings habe ich den Verdacht, dass dort "Squared" nicht viel Konkurrenz hat, zumal
dieses Verfahren auch effizient implementierbar ist).