MIN_VALUE は最小値かもしれないし最小値ではないかもしれない
浮動小数点プリミティブ型のラッパークラスの MIN_VALUE 定数フィールド、 Float.MIN_VALUE や Double.MIN_VALUE は、その型が表現できる最小の有限値であって、最小値ではない。
整数型の極値定数
Java にてプリミティブ型は、そのラッパークラスの静的定数フィールドに最大値と最小値が定義されています。
Integer.MAX_VALUE に最大値、Integer.MIN_VALUE に最小値です。
@Test public void limitOfInteger() { assertEquals(2147483647, Integer.MAX_VALUE); assertEquals(0x7fffffff, Integer.MAX_VALUE); assertEquals(-2147483648, Integer.MIN_VALUE); assertEquals(-0x80000000, Integer.MIN_VALUE); } @Test public void limitOfLong() { assertEquals(9223372036854775807L, Long.MAX_VALUE); assertEquals(0x7fffffffffffffffL, Long.MAX_VALUE); assertEquals(-9223372036854775808L, Long.MIN_VALUE); assertEquals(-0x8000000000000000L, Long.MIN_VALUE); }
Short 、Byte も同様です。
浮動小数点型の極値定数
Float.MIN_VALUE や Double.MIN_VALUE はその型の最小振幅値、すなわちビットが1個立った分の数を表します。
@Test public void limitOfFloatingPointTypes() { assertTrue("MIN_VALUE is not a negative", 0 < Double.MIN_VALUE); assertTrue("MIN_VALUE is not a negative", 0 < Float.MIN_VALUE); assertEquals(Double.longBitsToDouble(0x1), Double.MIN_VALUE, 0); assertEquals(Float.intBitsToFloat(0x1), Float.MIN_VALUE, 0); }
float や double が表現できる最小値は、MAX_VALUEの符号をマイナスにすることで得られます。
テストで極値を扱う時に、間違わないように気をつけたいです。
おまけ
整数型の最小値の符号を転換する(もしくは絶対値を求める)と、桁があふれてもとに戻ります。
@Test public void absoluteValueOfMinimumValue() { assertEquals(Integer.MIN_VALUE, -Integer.MIN_VALUE); assertEquals(Long.MIN_VALUE, -Long.MIN_VALUE); assertEquals(0x80000000, -0x80000000); assertEquals(0x8000000000000000L, -0x8000000000000000L); }
参考:numbers - Minimum values and Double.MIN_VALUE in Java? - Stack Overflow