float除0

3190 ワード

浮動小数点数プログラミングを行う場合,注意しないと,1.#IND,1.#INFまたはnan,infのような奇妙な出力が出力されることが多い.これは通常、浮動小数点数操作の異常を隠します.
特殊浮動小数点数の意味1.#INF/inf:この値は「無限大(infinityの略)」を表し、すなわちコンピュータが表すことができる浮動小数点数の最大範囲を超えている(あるいはdoubleタイプの最大値を超えている).例えば、整数を0で除くと、1.#INF/infの値が得られる.したがって、負の整数を0で除算すると、-1.#INF/-infの値が得られる.-1.#IND/nan:これはより複雑であり、一般的には、定義されていない結果(不正)の浮動小数点数演算から来ている.「IND」はindeterminateの略で、「nan」はnot a numberの略です.この値を生成する一般的な例としては,負数に対して平方を開き,負数に対して対数を取り,0.0/0.0,0.0*∞,∞/∞などがある.
簡単に言えば、1.#INF/infに遭遇した場合、演算結果オーバーフロー除零が発生したかどうかをチェックし、1.#IND/nanに遭遇した場合、不正な演算が発生したかどうかをチェックする.
特殊浮動小数点数の判断
多くの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であるか否かの判断も実現できる.
JAvaではc++とあまり差がありません.次はテストコードです.
public class Text {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		float a=0,b=5,c=-5;
		System.out.println(a/0);//   NaN
		System.out.println(b/0);//   Infinity
		System.out.println(c/0);//   -Infinity
	}

}