ラッパークラスに用意されている定数の注意
最小値、最大値を抽出する方法について(https://coneta.jp/article/show/2788)では整数の配列から最小値、最大値を抽出する例を記載したが、この例を実数の配列を対象にしたものに書き換える場合、
double[] array = { 1, -2, 3, -4, 5, -6, 7, -8, 9, -10 };
// 動かない
double min = Double.MAX_VALUE;
double max = Double.MIN_VALUE;
for (double value : array) {
if (value < min) {
min = value;
}
if (max < value) {
max = value;
}
}
のようにするのは誤りである。これは、Double.MIN_VALUE
の値の意味がInteger.MIN_VALUE
の値の意味と異なるため。
それぞれの値を見てみると、
Integer.MIN_VALUE
→0x80000000
= -231Integer.MAX_VALUE
→0x7fffffff
= 231-1Double.MIN_VALUE
→0x0.0000000000001P-1022
= 2-1074Double.MAX_VALUE
→0x1.fffffffffffffP+1023
= 21023
であり、Integer.MIN_VALUE
が負の数であるのに対しDouble.MIN_VALUE
は負の数ではなく0に最も近い最小値を示すものとなっている。
そのため、上記の例のように実数型で取り得る最小値、最大値を表現したい場合は、Double.NEGATIVE_INFINITY
またはDouble.POSITIVE_INFINITY
を使用するのが良い。
// 動く
double min = Double.POSITIVE_INFINITY;
double max = Double.NEGATIVE_INFINITY;
for (double value : array) {
if (value < min) {
min = value;
}
if (max < value) {
max = value;
}
}