C++演算結果1.#IND, 1.#INF,nan,inf原因

1338 ワード

原文アドレス:クリックしてリンクを開く
浮動小数点数のプログラミングを行う場合、注意しないと出力が1.IND, 1.#INFとかnanとかinfとか変な出力.これは通常、浮動小数点数操作の異常を隠します.
1.特殊浮動小数点数の意味
(1)1.#INF/inf:この値は「無限大(infinityの略)」を表し、コンピュータが表すことができる浮動小数点数の最大範囲(またはdoubleタイプの最大値を超えた)を表します.たとえば、整数を0で除算すると1.#が得られます.INF/inf値;したがって、負の整数を0で除算すると-1.INF/-inf値です.
(2)-1.#IND/nan:これはより複雑で、一般的には、定義されていない結果(不正)の浮動小数点数演算から来ています.「IND」はindeterminateの略で、「nan」はnot a numberの略です.この値を生成する一般的な例は,負数に対して平方を開き,負数に対して対数をとり,0.0/0.0,0.0*∞,∞/∞などである.例を挙げると、log()内の値が1.#である場合INF、得られたlog値は、1.#INF.              
(3)だから簡単に言えば、1.#に出会ったらINF/infは、演算結果オーバーフローゼロが発生したかどうかを確認し、1.#IND/nanは、不正な演算が発生しているかどうかをチェックします.
2.特殊浮動小数点数の判断
多くのCライブラリでは、浮動小数点数が無限大またはNaNであるかどうかを判断するための関数のセットが提供されています.
int  _isnan(double x)関数は、浮動小数点数がNaNであるか否かを判断するために使用され、int_finite(double x)は、浮動小数点数が無限大であるかどうかを判断するために使用される.
上の2つの関数は以下の線で始まるため、移植性に問題がある可能性があることに気づいたかもしれませんが、一般的な判断バージョンを実現するにはどうすればいいのでしょうか.まず、Nanについては、以下のコードで実現することができる.
bool IsNumber(double x)
{
    //                 true
    //         IEEE 754     NaN        false!
    return (x == x);
}
、次のコードは、浮動小数点数が限られているかどうかを判断することができる(finite、すなわち、NaNでもinfiniteでもない).
bool IsFiniteNumber(double x)
{
    return (x <= DBL_MAX && x >= -DBL_MAX);
}
DBL_MAXは、で定義されている定数です.
上の2つの関数を組み合わせることで,1つの浮動小数点数がInfであるか否かの判断も実現できる.