C ++ 11およびC11標準は、
std::isfinite
関数を定義します。cmath
Visual Studio 2012は、またはの一部としてそれを提供してい
ないようですが、
math.h
この機能を提供しているようです。amp_math.h
とisfinite
互換性がありstd::isfinite
ますか?ドキュメントには、で呼び出されたときの動作については説明されておらず、NAN
これをテストするためのVSコンパイラがありません。
C ++ 11およびC11標準は、
std::isfinite
関数を定義します。cmath
Visual Studio 2012は、またはの一部としてそれを提供してい
ないようですが、
math.h
この機能を提供しているようです。amp_math.h
とisfinite
互換性がありstd::isfinite
ますか?ドキュメントには、で呼び出されたときの動作については説明されておらず、NAN
これをテストするためのVSコンパイラがありません。
Mariusがすでに指摘しているように、fromisfinite
はamp_math.h
C++ AMP で使用されます。これは、CUDA や OpenCL に似たメニーコア アーキテクチャでの並列計算用のMS拡張です。また、この関数は実際の AMP 制限関数 (通常は GPU カーネル) でのみ使用できるため、一般的な用途にはあまり役立ちません。
残念ながら、VS 2012は C++11 の数学および浮動小数点制御関数をサポートしていません。ただし、 VCを使用していることを認識し、そのための特別なコードを実装すると、少なくともVS 2003以降でサポートされているMS固有の機能であるfromを使用できます_finite
(またはむしろを使用できます) 。ただし、 s のみを使用するため、すべての非引数を変換することに注意してください(ただし、VCには適切なものがないようです) 。シグナリングのトラッピングの場合!_finite
<float.h>
_finite
double
double
long double
INF
NaN
NaN
への直接呼び出しからも変換されますstd::finite
)。
VCの標準ライブラリには、C++11/C99 サポート (など) の欠如に対応するための他の関数_isnan
があります。(ただし、これらの関数の前にあるアンダースコアを削除して単純な<cfenv>
ラッパーを配置することを拒否し_controlfp
、C ++ 11サポートの完了に少し近づく理由は、まったく別の問題です。)
編集:それ以外に、INF
s とNaN
s をチェックするための簡単なアプローチも機能する可能性があります。
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
isfinite
fromは、 でamp_math.h
マークされた関数からのみ呼び出すことができますrestrict(amp)
。これは、たとえ動作が同じであっても、互換性を持たせません。