2013-07-06 7 views
5

私はシェーダプログラムでは、様々なフロートしている場合:glslで変動フロートの等価性テストが失敗するのはなぜですか?

varying highp float someFloat; 

をし、頂点シェーダに、私は何かに設定してください。

someFloat = 1.0; 

なぜ私のフラグメントシェーダでこの比較はfalseを返すように見えるのですか?

someFloat == 1.0 // false 

これは本当ですか?

someFloat > .0 // true 

iPad miniのopenGL ESでのテスト。

答えて

11

IEEE 754浮動小数点数で発生します。これは、浮動小数点表記の性質によるものです。 IEEE 754形式を使用する言語でも同じ問題が発生します。

1.0は、1.000000000...という浮動小数点システムでは正確に表現されない可能性がありますので、==を使用して比較することは危険です。 浮動小数点数は常にイプシロン値と比較する必要があります。

浮動小数点計算には少しの不確実性が伴いますので、2つの数値が互いに「近い」かどうかを確認することでこれを可能にすることができます。あなたが決定した場合 - - エラー分析、テスト、または野生の推測に基づいて結果が常に期待される結果の0.00001の範囲内であることを、あなたはこれまであなたの比較変更することができます。

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

を最大誤差値は、一般的ですイプシロンと呼ばれる。

おそらくお読みくださいWhat Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

ありがとうございました!私は今私が尋ねてうれしいです。 –

関連する問題