MAX_VALUE, MIN_VALUE, NaN, NEGATIVE_INFINITY, POSITIVE_INFINITY は単純に比較可能かどうか調べてみた。

結論

NaN は比較不可能。他の値は相互に比較可能。

(小) NEGATIVE_INFINITY < MIN_VALUE -1 < 0 < 1 < MAX_VALUE < POSITIVE_INFINITY (大)

テスト用ソースコード


public class DoubleTest {
 
  public static void main(String[] args) {
 
    // MAX_VALUE - double 型の正の最大有限値
    // MIN_VALUE - double 型の正の最小有限値
    // NaN - double 型の非数 (NaN) 値
    // NEGATIVE_INFINITY - double 型の負の無限大値
    // POSITIVE_INFINITY  - double 型の正の無限大値
    DT[] dt = new DT[]{
      new DT( 0,  "0"),
      new DT( 1,  "1"),
      new DT(-1, "-1"),
      new DT(Double.MAX_VALUE, "MAX_VALUE"),
      new DT(Double.MIN_VALUE, "MIN_VALUE"),
      new DT(Double.NaN, "NaN"),
      new DT(Double.NEGATIVE_INFINITY, "NEGATIVE_INFINITY"),
      new DT(Double.POSITIVE_INFINITY , "POSITIVE_INFINITY"),
    };
 
    // 400.400桁まで対応可能
    java.text.DecimalFormat df =
      new java.text.DecimalFormat(
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "." +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################" +
          "########################################");
 
    System.out.println("------------------------------");
    for(int i=0; i<dt.length; i++){
      System.out.println(dt[i].s + " = " + df.format(dt[i].d));
    }
 
    System.out.println("------------------------------");
    for(int i=0; i<dt.length; i++){
      for(int j=0; j<dt.length; j++){
        try{ // なんだか例外が発生しそうな予感
          if(dt[i].d == dt[j].d){
            System.out.println(dt[i].s + " == " + dt[j].s);
          }else if(dt[i].d < dt[j].d){
            System.out.println(dt[i].s + " < " + dt[j].s);
          }else if(dt[i].d > dt[j].d){
            System.out.println(dt[i].s + " > " + dt[j].s);
          }else{
            System.out.println(dt[i].s + " ? " + dt[j].s);
          }
        }catch(Exception e){
          System.out.println(dt[i].s + " " + e + " " + dt[j].s);
        }
      }
    }
  }
 
  private static class DT{
    DT(double d, String s){
      this.d = d;
      this.s = s;
    }
    double d;
    String s;
  }
}

実行結果


------------------------------
0 = 0
1 = 1
-1 = -1
MAX_VALUE = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
MIN_VALUE = 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049
NaN = ?
NEGATIVE_INFINITY = -∞
POSITIVE_INFINITY = ∞
------------------------------
0 == 0
0 < 1
0 > -1
0 < MAX_VALUE
0 < MIN_VALUE
0 ? NaN
0 > NEGATIVE_INFINITY
0 < POSITIVE_INFINITY
1 > 0
1 == 1
1 > -1
1 < MAX_VALUE
1 > MIN_VALUE
1 ? NaN
1 > NEGATIVE_INFINITY
1 < POSITIVE_INFINITY
-1 < 0
-1 < 1
-1 == -1
-1 < MAX_VALUE
-1 < MIN_VALUE
-1 ? NaN
-1 > NEGATIVE_INFINITY
-1 < POSITIVE_INFINITY
MAX_VALUE > 0
MAX_VALUE > 1
MAX_VALUE > -1
MAX_VALUE == MAX_VALUE
MAX_VALUE > MIN_VALUE
MAX_VALUE ? NaN
MAX_VALUE > NEGATIVE_INFINITY
MAX_VALUE < POSITIVE_INFINITY
MIN_VALUE > 0
MIN_VALUE < 1
MIN_VALUE > -1
MIN_VALUE < MAX_VALUE
MIN_VALUE == MIN_VALUE
MIN_VALUE ? NaN
MIN_VALUE > NEGATIVE_INFINITY
MIN_VALUE < POSITIVE_INFINITY
NaN ? 0
NaN ? 1
NaN ? -1
NaN ? MAX_VALUE
NaN ? MIN_VALUE
NaN ? NaN
NaN ? NEGATIVE_INFINITY
NaN ? POSITIVE_INFINITY
NEGATIVE_INFINITY < 0
NEGATIVE_INFINITY < 1
NEGATIVE_INFINITY < -1
NEGATIVE_INFINITY < MAX_VALUE
NEGATIVE_INFINITY < MIN_VALUE
NEGATIVE_INFINITY ? NaN
NEGATIVE_INFINITY == NEGATIVE_INFINITY
NEGATIVE_INFINITY < POSITIVE_INFINITY
POSITIVE_INFINITY > 0
POSITIVE_INFINITY > 1
POSITIVE_INFINITY > -1
POSITIVE_INFINITY > MAX_VALUE
POSITIVE_INFINITY > MIN_VALUE
POSITIVE_INFINITY ? NaN
POSITIVE_INFINITY > NEGATIVE_INFINITY
POSITIVE_INFINITY == POSITIVE_INFINITY

tags: zlashdot Java Java

Posted by NI-Lab. (@nilab)