サイエンスデザインノート

仕事やプログラミングやそうでないことwo覚え書くブログです

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_VALUEDouble.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