C ++ 11およびC11標準は、
std::isfinite
関数を定義します。cmathVisual Studio 2012は、またはの一部としてそれを提供してい
ないようですが、
math.hこの機能を提供しているようです。amp_math.h
とisfinite互換性がありstd::isfiniteますか?ドキュメントには、で呼び出されたときの動作については説明されておらず、NAN
これをテストするためのVSコンパイラがありません。
C ++ 11およびC11標準は、
std::isfinite
関数を定義します。cmathVisual Studio 2012は、またはの一部としてそれを提供してい
ないようですが、
math.hこの機能を提供しているようです。amp_math.h
とisfinite互換性がありstd::isfiniteますか?ドキュメントには、で呼び出されたときの動作については説明されておらず、NAN
これをテストするためのVSコンパイラがありません。
Mariusがすでに指摘しているように、fromisfiniteはamp_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
isfinitefromは、 でamp_math.hマークされた関数からのみ呼び出すことができますrestrict(amp)。これは、たとえ動作が同じであっても、互換性を持たせません。