Math "pow" 関数は -1.#IND を返します。-1.#IND とはどのようなエラー値で、if ステートメントでエラーを検出するにはどうすればよいですか?
4 に答える
-1.#IND
WindowsでのNaNのテキスト表現です。
次の小さな関数を使用して、float 値が NaN かどうかを確認できます。
// NaN never compares equal, not even to itself
bool is_nan(double d){ return d != d; }
(@chris が指摘しているように、C++11 準拠の stdlib がある場合はstd::isnan
、<cmath>
.)
通常のプログラム フローでは、数学入力の健全性をチェックする限り、NaN について心配する必要はありません。もちろん、逆の方法で数学計算を行い、後で NaN をチェックすることもできます。:)
表示される値はNaNの表現であるか、数値ではありません。これらの値は、未定義の値を持つ浮動小数点演算の結果として表示されます。たとえば0.0 / 0.0
、 NaN が生成されます。NaN が生成される状況は他にも多数あります。浮動小数点値が NaN かどうかを判断したい場合は、次のようにテストできます。
if (std::isnan(value)) {
...
}
正または負の無限大など、浮動小数点演算の結果として生成できるその他の特別な値はほとんどなく、<cmath>
これらのテストも用意されています。
-1.#IND
は数値ではなく NaN です。NaN は多くの理由で発生します。0.0/0.0 などの式は不確定です。試してみると NaN が得られます。-1 (または任意の負の実数) の平方根は純粋な虚数です。float または doublesqrt
関数を使用すると、結果として NaN が得られます。ここでは、結果は不確定ではありませんが、現実でもありません。ナンです。
別の表現方法は、sqrt(-1.0)
ですpow(-1.0, 0.5)
。これも NaN を生成します。
-1#IND は通常、コードのどこかに /0 がある場合に発生します。pow 関数のすべての分母または基数を -ve 指数で 0 にチェックすることで、これを防ぎます。
除算または pow 操作が完了したら、入力を確認していない場合は、次の方法で出力を確認します。
if (output != output) return 0; // or some default
else return output;