3

これは次の質問に基づいています: OpenGL シェーダーで NaN を検出する最良の方法

標準 GLSL では、検出のために isnan() および isinf() 関数が定義されています。OpenGL ES 2.0 シェーディング言語はそうではありません。それにもかかわらず、NaNとInfsをどのように処理できますか?

4

3 に答える 3

5

NaN に対してのみ true になる条件を使用して、NaN を確認できます。

bool isNan(float val)
{
  return (val <= 0.0 || 0.0 <= val) ? false : true;
}

isinfはもう少し難しいです。float を整数表現に変換してビットを操作するメカニズムはありません。したがって、適切に大きな数と比較する必要があります。

于 2012-08-04T22:28:24.850 に答える
2

WebGL の同じ問題。Nicol Bolas の回答は、ほとんどの GPU で適切に機能しますが、一部の nVidia では機能しません。このバージョンは、私が試す機会があったすべての GPU でうまく機能します。

bool isNan( float val )
{
  return ( val < 0.0 || 0.0 < val || val == 0.0 ) ? false : true;
  // important: some nVidias failed to cope with version below.
  // Probably wrong optimization.
  /*return ( val <= 0.0 || 0.0 <= val ) ? false : true;*/
}
于 2015-12-14T20:30:25.157 に答える
0

テストされていないため、(最適化のため) これが機能するかどうかはわかりませんが、Inf と -Inf の両方で機能するはずです。

  bool isinf(float val) {
    return (val != 0.0 && val * 2.0 == val) ? true : false;
  }
于 2016-12-08T08:52:35.277 に答える