ラッパークラスに用意されている定数の注意

最小値、最大値を抽出する方法について(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_VALUE0x80000000 = -231
  • Integer.MAX_VALUE0x7fffffff = 231-1
  • Double.MIN_VALUE0x0.0000000000001P-1022 = 2-1074
  • Double.MAX_VALUE0x1.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;
    }
}