Ich brauche eine acos()
Funktion mit doppelter Genauigkeit innerhalb eines Compute-Shaders. Da es keine eingebaute Funktion von acos()
in GLSL mit doppelter Genauigkeit gibt, habe ich versucht, meine eigene zu implementieren.Gibt es eine genaue Annäherung der acos() - Funktion?
Zuerst habe ich eine Taylor-Serie wie die Gleichung aus Wiki - Taylor series mit vorberechneten Fakultät Werte implementiert. Aber das scheint um 1 herum ungenau zu sein. Der maximale Fehler betrug ungefähr 0,08 mit 40 Iterationen.
Ich implementiert auch this method, die sehr gut auf CPU mit einem maximalen Fehler von -2.22045e-16 funktioniert, aber ich habe einige Probleme, dies innerhalb des Shaders zu implementieren.
Derzeit verwende ich eine acos()
Approximationsfunktion von here, wo jemand seine Approximationsfunktionen auf this Seite veröffentlicht. Ich verwende die genaueste Funktion dieser Seite und jetzt bekomme ich einen maximalen Fehler von -7.60454e-08, aber auch dieser Fehler ist zu hoch.
Mein Code dieser Funktion ist:
double myACOS(double x)
{
double part[4];
part[0] = 32768.0/2835.0*sqrt(2.0-sqrt(2.0+sqrt(2.0+sqrt(2.0+2.0*x))));
part[1] = 256.0/135.0*sqrt(2.0-sqrt(2.0+sqrt(2.0+2.0*x)));
part[2] = 8.0/135.0*sqrt(2.0-sqrt(2.0+2.0*x));
part[3] = 1.0/2835.0*sqrt(2.0-2.0*x);
return (part[0]-part[1]+part[2]-part[3]);
}
Kennt jemand eine andere Implementierungsmethode von acos()
, die sehr genau ist und -wenn möglich- einfach in einem Shader zu implementieren?
Einige Systeminformationen:
- Nvidia GT 555M
- laufen OpenGL 4.3 mit optirun
warum brauchen sie acos? wenn es für slerp ist, kann man mit wiederholten lerps teilen und erobern –
gibt es einen Standard [acos] (http://www.cplusplus.com/reference/cmath/acos/) in '' –
NathanOliver
Heiliger Mist, benutze einen Nachschlag Tabelle, wenn Sie so viele 'sqrt's benötigen. –