wie ich schon sagte, ich möchte meine eigene Double-Precision-Funktion cos() in einem Compute-Shader mit GLSL implementieren, weil es nur eine eingebaute Version für float gibt.Das Ergebnis der eigenen Double-Cos() - Implementierung in einem Shader ist NaN, funktioniert aber gut auf der CPU. Was läuft falsch?
Dies ist mein Code:
double faculty[41];//values are calculated at the beginning of main()
double myCOS(double x)
{
double sum,tempExp,sign;
sum = 1.0;
tempExp = 1.0;
sign = -1.0;
for(int i = 1; i <= 30; i++)
{
tempExp *= x;
if(i % 2 == 0){
sum = sum + (sign * (tempExp/faculty[i]));
sign *= -1.0;
}
}
return sum;
}
Das Ergebnis dieses Codes ist, dass die Summe NaN am Shader sich herausstellt, aber auf der CPU und der Algorithmus funktioniert. Ich habe versucht, zu diesem Code zu debuggen, und ich habe die folgenden Informationen:
- Fakultät [i] positiv ist und nicht null für alle Einträge
- tempExp in jedem Schritt positiv ist
- keiner der anderen Variablen bei jedem Schritt sind NaN
- das erste Mal Summe ist NaN im Schritt mit i = 4
und nun meine Frage: Was genau schief gehen kann, wenn jede Variable eine Zahl und nichts wird geteilt insbesondere dann, wenn der Algorithmus auf der CPU arbeitet?
Unendlichkeit geteilt durch Unendlichkeit, zum Beispiel. Was sind deine Eingabedaten? – Wintermute
http://StackOverflow.com/a/4430934/17034 –
@Wintermute Ich bin nicht wirklich sicher darüber und es ist schwer, genaue Werte in einem Shader zu schätzen. Ein Teil davon ist positiv und der Rest ist negativ. Aber ich werde versuchen, sie zu schätzen. – DanceIgel