10

C ++ 11およびC11標準は、 std::isfinite 関数を定義します。cmathVisual Studio 2012は、またはの一部としてそれを提供してい ないようですが、 math.hこの機能を提供しているようです。amp_math.h

isfinite互換性がありstd::isfiniteますか?ドキュメントには、で呼び出されたときの動作については説明されておらず、NAN これをテストするためのVSコンパイラがありません。

4

2 に答える 2

18

Mariusがすでに指摘しているように、fromisfiniteamp_math.hC++ AMP で使用されます。これは、CUDA や OpenCL に似たメニーコア アーキテクチャでの並列計算用のMS拡張です。また、この関数は実際の AMP 制限関数 (通常は GPU カーネル) でのみ使用できるため、一般的な用途にはあまり役立ちません。

残念ながら、VS 2012は C++11 の数学および浮動小数点制御関数をサポートしていません。ただし、 VCを使用していることを認識し、そのための特別なコードを実装すると、少なくともVS 2003以降でサポートされているMS固有の機能であるfromを使用できます_finite(またはむしろを使用できます) 。ただし、 s のみを使用するため、すべての非引数を変換することに注意してください(ただし、VCには適切なものがないようです) 。シグナリングのトラッピングの場合!_finite<float.h>_finitedoubledoublelong doubleINFNaNNaNへの直接呼び出しからも変換されますstd::finite)。

VCの標準ライブラリには、C++11/C99 サポート (など) の欠如に対応するための他の関数_isnanがあります。(ただし、これらの関数の前にあるアンダースコアを削除して単純な<cfenv>ラッパーを配置することを拒否し_controlfp、C ++ 11サポートの完了に少し近づく理由は、まったく別の問題です。)

編集:それ以外に、INFs とNaNs をチェックするための簡単なアプローチも機能する可能性があります。

template<typename T> bool isfinite(T arg)
{
    return arg == arg && 
           arg != std::numeric_limits<T>::infinity() &&
           arg != -std::numeric_limits<T>::infinity();
}

しかし、もちろん、おそらくシグナリング s をトラップするという同じ意味があります (ただし、シグナリングs と浮動小数点例外全般のNaN複雑さに精通していないことを認めなければなりません)。NaN

于 2013-01-29T11:42:59.663 に答える
5

isfinitefromは、 でamp_math.hマークされた関数からのみ呼び出すことができますrestrict(amp)。これは、たとえ動作が同じであっても、互換性を持たせません。

于 2013-01-29T10:23:48.577 に答える