Infinity
実数のオーバーフローはInfinity
実数演算で最大値を超えるような演算をすると、結果がInfinity
になる。最小値を下回る演算の場合は-Infinity
。Infinity
のリテラルはない。
1 2 3 4 5 6 |
double dMaxP = Double.MAX_VALUE; System.out.println(dMaxP * 2); // Infinity double dMaxN = -Double.MAX_VALUE; System.out.println(dMaxN * 2); // -Infinity System.out.prinln(Infinity); // コンパイルエラー:Infinityを変数に解決できません |
Infinityに対する数値の演算結果は直感的
Infinity
に対して数値を加減乗除しても結果はInfinity
。で、数学の∞と同じ。
1 2 3 4 |
System.out.println(infinity + 2); // Infinity System.out.println(infinity - 2); // Infinity System.out.println(infinity * 2); // Infinity System.out.println(infinity / 2); // Infinity |
数値からInfinity
を減じると-Infinity
、Infinity
で割ると0.0。lim[x→∞]
と考えると直感的。
1 2 |
System.out.println(2 - infinity); // -Infinity System.out.println(2 / infinity); // 0.0 |
Infinity同士の演算
Infinity
同士の加算・乗算はInfinity
。Infinity
同士の減算・除算はNaN
。
1 2 3 4 |
System.out.println(infinity + infinity); // Infinity System.out.println(infinity - infinity); // NaN System.out.println(infinity * infinity); // Infinity System.out.println(infinity / infinity); // NaN |
Infinityと最大値
Infinity
は実数の最大値より大きく、これと等しくはない。
1 2 3 4 |
System.out.println(infinity > Double.MAX_VALUE); // true System.out.println(infinity < Double.MAX_VALUE); // false System.out.println(infinity == Double.MAX_VALUE); // false System.out.println(infinity != Double.MAX_VALUE); // true |
Infinity同士の大小比較
Infinity
はInfinity
と等しい。
1 2 3 4 |
System.out.println(infinity == infinity); System.out.println(infinity != infinity); System.out.println(infinity > infinity); System.out.println(infinity < infinity); |
Infinityの定数定義
Infinity
はdouble
型とfloat
型で定義されていて、それらの定数定義も準備されている。
1 2 3 4 5 6 7 8 9 |
double pDblInfinity = Double.POSITIVE_INFINITY; double nDblInfinity = Double.NEGATIVE_INFINITY; System.out.println(pDblInfinity); // Infinity System.out.println(nDblInfinity); // -Infinity float pFltInfinity = Float.POSITIVE_INFINITY; float nFltInfinity = Float.NEGATIVE_INFINITY; System.out.println(pFltInfinity); // Infinity System.out.println(nFltInfinity); // -Infinity |
double
型とfloat
型で、Infinity
と-Infinity
はそれぞれ等しい。
1 2 |
System.out.println(pDblInfinity == pFltInfinity); System.out.println(nDblInfinity == nFltInfinity); |
NaN
計算結果が不定→NaN
実数演算でゼロ同士やInfinity
同士の除算結果はNaN
(Not a Number)になる。NaN
のリテラルはない。
1 2 3 4 |
System.out.println(0.0 / 0); // NaN System.out.println(infinity / infinity); // NaN System.out.println(NaN); // コンパイルエラー:NaNを変数に解決できません |
NaNを含む演算はNaN
NaN
を含む四則演算の結果は全てNaN
。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
double nan = 0.0 / 0; System.out.println(nan + 1); // NaN System.out.println(nan - 1); // NaN System.out.println(nan * 1); // NaN System.out.println(nan / 1); // NaN System.out.println(1 - nan); // NaN System.out.println(1 / nan); // NaN System.out.println(nan + nan); // NaN System.out.println(nan - nan); // NaN System.out.println(nan * nan); // NaN System.out.println(nan / nan); // NaN |
NaN != NaN
NaN
同士は互いに等しくない。大小関係は特定できない(>
でも<
でもない)。
1 2 3 4 |
System.out.println(nan == nan); // false System.out.println(nan != nan); // true System.out.println(nan > nan); // false System.out.println(nan < nan); // false |
NaNの定数定義
NaN
はdouble
型とfloat
型で定義されていて、それらの定数定義も準備されている。double
型のNaN
とfloat
型のNaN
は等しくない(double
型同士やfloat
型同士と同じように)。
1 2 3 4 5 6 |
double dNan = Double.NaN; float fNan = Float.NaN; System.out.println(dNan); System.out.println(fNan); System.out.println(dNan == fNan); // false System.out.println(dNan != fNan); // true |
InfinityとNaN
Infinity
とNaN
の演算結果はNaN
。
1 2 3 4 |
System.out.println(infinity + nan); // NaN System.out.println(infinity - nan); // NaN System.out.println(infinity * nan); // NaN System.out.println(infinity / nan); // NaN |
Infinity
とNaN
は互いに等しくない。大小関係は特定できない(>
でも<
でもない)。
1 2 3 4 |
System.out.println(infinity == nan); // false System.out.println(infinity != nan); // false System.out.println(infinity > nan); // false System.out.println(infinity < nan); // false |