7

シェーダー プログラムにさまざまなフロートがある場合:

varying highp float someFloat;

そして頂点シェーダーで、それを何かに設定しました。

someFloat = 1.0;

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

someFloat == 1.0 // false

しかし、これはtrueを返しますか?

someFloat > .0 // true

iPad mini での openGL ES のテスト。

4

1 に答える 1

13

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

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

浮動小数点の計算には多少の不確実性が伴うため、2 つの数値が互いに「近い」かどうかを確認することで、これを許容することができます。エラー分析、テスト、または推測に基づいて、結果が常に期待される結果の 0.00001 以内にあると判断した場合は、比較を次のように変更できます。

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

最大エラー値は通常イプシロンと呼ばれます。

おそらく、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを読む必要があります

于 2013-07-06T20:05:57.693 に答える