Ho bisogno di una funzione acos()
con una precisione doppia all'interno di uno shader di elaborazione. Poiché non esiste una funzione integrata di acos()
in GLSL con una precisione doppia, ho provato a implementare la mia.Esiste un'accurata approssimazione della funzione acos()?
Inizialmente, ho implementato una serie di Taylor come l'equazione da Wiki - Taylor series con valori di facoltà precalcolati. Ma questo sembra essere inaccurato intorno a 1. L'errore massimo era qualcosa di circa 0.08 con 40 iterazioni.
Ho anche implementato this method che funziona molto bene sulla CPU con un errore massimo di -2.22045e-16, ma ho alcuni problemi per implementarlo nello shader.
Attualmente, sto usando una funzione di approssimazione acos()
da here dove qualcuno ha pubblicato le sue funzioni di approssimazione sul sito this. Sto usando la funzione più precisa di questo sito e ora ottengo un errore massimo di -7.60454e-08, ma anche che l'errore è troppo alto.
Il mio codice di questa funzione è:
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]);
}
Qualcuno sa un altro metodo attuazione acos()
che è molto accurata e -se possibile- facile da implementare in uno shader?
alcune informazioni di sistema:
- Nvidia GT 555M
- esecuzione OpenGL 4.3 con optirun
perché hai bisogno di acos? se è per slerp puoi dividere e conquistare con ripetuti caratteri –
c'è uno standard [acos] (http://www.cplusplus.com/reference/cmath/acos/) in '' –
NathanOliver
Holy crap, usa una ricerca tabella se hai bisogno di molti 'sqrt's. –