come ho detto, voglio implementare la mia funzione di doppia precisione cos() in uno shader di elaborazione con GLSL, perché c'è solo una versione integrata per float.Il risultato della propria implementazione di cos() a doppia precisione in uno shader è NaN, ma funziona bene sulla CPU. Cosa sta andando storto?
Questo è il mio codice:
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;
}
Il risultato di questo codice è, che la somma risulta essere NaN sullo shader, ma sulla CPU l'algoritmo funziona bene. Ho cercato di eseguire il debug di questo codice troppo e ho ottenuto le seguenti informazioni:
- facoltà [i] è positivo e non pari a zero per tutte le voci
- tempExp è positiva in ogni fase
- nessuna delle altre variabili sono NaN in ogni fase
- la prima somma il tempo è NaN è al passo con i = 4
e ora la mia domanda: che cosa può andare male se ogni variabile è un numero e niente è diviso da zero soprattutto quando l'algoritmo funziona sulla CPU?
infinito diviso per l'infinito, ad esempio. Qual è il tuo dati di input? – Wintermute
http://stackoverflow.com/a/4430934/17034 –
@Wintermute Non ne sono veramente sicuro ed è difficile stimare i valori esatti in uno shader. Una parte di essa è positiva e il resto è negativo. Ma proverò a stimarli. – DanceIgel