2013-07-06 8 views
5

Wenn ich ein variierendes Schwimmer in meinem Shader-Programm haben:Warum scheitert der variierende Float-Gleichheitstest in glsl?

varying highp float someFloat; 

und in der Vertex-Shader, habe ich es zu etwas.

someFloat = 1.0; 

Warum in meinem Fragment-Shader scheint dieser Vergleich falsch?

someFloat == 1.0 // false 

aber das ist wahr?

someFloat > .0 // true 

Testen auf OpenGL ES in einem iPad mini.

Antwort

11

Es passiert auf jeder IEEE 754 Gleitkommazahl. Dies liegt an der Natur der Gleitkommadarstellung. Jede Sprache, die das IEEE 754-Format verwendet, wird das gleiche Problem auftreten.

Da 1.0 möglicherweise nicht genau in Fließkomma-System wie 1.000000000... dargestellt wird, gilt es daher als gefährlich, sie mit == zu vergleichen. Gleitkommazahlen sollten immer mit einem Epsilon-Wert verglichen werden.

Da Gleitkommaberechnungen ein wenig Unsicherheit mit sich bringen, können wir versuchen, dies zu berücksichtigen, indem wir sehen, ob zwei Zahlen "nahe beieinander" sind. Wenn Sie sich entscheiden - basierend auf der Fehleranalyse, Prüfung oder eine wilde Vermutung -, dass das Ergebnis immer innerhalb 0,00001 des erwarteten Ergebnisses sein soll, dann können Sie Ihren Vergleich dazu ändern:

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

Der Maximalwert Fehler ist in der Regel namens Epsilon.

Wahrscheinlich sollten Sie lesen What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

Vielen Dank! Ich bin jetzt froh, dass ich gefragt habe. –