2013-07-06 13 views
5

Se ho un galleggiante che varia nel mio programma di shader:Perché il test di uguaglianza float varia fallito in glsl?

varying highp float someFloat; 

e nel vertex shader, ho impostato a qualcosa.

perché nel mio frammento shader questo confronto sembra restituire falso?

someFloat == 1.0 // false 

ma questo restituisce vero?

someFloat > .0 // true 

test su openGL ES in un mini iPad.

risposta

11

Si verifica su qualsiasi numero in virgola mobile IEEE 754. È a causa della natura della rappresentazione in virgola mobile. Qualsiasi lingua che utilizza il formato IEEE 754 incontrerà lo stesso problema.

Poiché non può essere rappresentato esattamente nel sistema a virgola mobile come 1.000000000..., è considerato pericoloso confrontarlo utilizzando ==. I numeri in virgola mobile devono sempre essere confrontati con un valore epsilon.

Poiché i calcoli in virgola mobile implicano un po 'di incertezza, possiamo provare a tener conto di ciò osservando se due numeri sono "vicini" l'uno all'altro. Se si decide - sulla base di analisi degli errori, test o un ipotesi - che il risultato deve essere sempre all'interno 0,00001 del risultato atteso allora si può cambiare la vostra confronto a questo:

if (fabs(someFloat - 1.0)) < 0.00001) 

Il valore massimo errore è in genere chiamato epsilon.

Probabilmente si dovrebbe leggere What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

Grazie! Ora sono contento di averlo chiesto. –

Problemi correlati