1. 程式人生 > >Java-NaN和INFINITY

Java-NaN和INFINITY

Java-NaN和INFINITY

0x01 摘要

今天再看WeakHashMap原始碼的時候,突然發現有個Float.isNaN方法,這個是什麼鬼?
趕緊看了看,補下這方面知識點。

0x02 NaN

/**
 * A constant holding a Not-a-Number (NaN) value of type
 * {@code float}.  It is equivalent to the value returned by
 * {@code Float.intBitsToFloat(0x7fc00000)}.
 * NaN是一個常量,以float型別儲存一個`非數字`的值
 * 居然是用0.0f/0.0f表示這個值的
 */
public static final float NaN = 0.0f / 0.0f; /** * 如果指定的變數的值是一個`非數字`的值就返回true,否則返回false * 這個方法很有意思,居然是自己和自己作比較! */ public static boolean isNaN(float v) { return (v != v); }

0x03 INFINITY

/**
 * A constant holding the positive infinity of type
 * {@code float}. It is equal to the value returned by
 * {@code Float.intBitsToFloat(0x7f800000)}.
 * POSITIVE_INFINITY是一個常量,以float型別表示無窮大
 */
public static final float POSITIVE_INFINITY = 1.0f / 0.0f; /** * A constant holding the negative infinity of type * {@code float}. It is equal to the value returned by * {@code Float.intBitsToFloat(0xff800000)}. * NEGATIVE_INFINITY是一個常量,以float型別表示無窮小 */ public static final float NEGATIVE_INFINITY = -1.0f /
0.0f;

0x04 測試例子

public static void main(String[] args)
{
    System.out.println("Float.NEGATIVE_INFINITY=" + Float.NEGATIVE_INFINITY);
    System.out.println("Float.POSITIVE_INFINITY=" + Float.POSITIVE_INFINITY);
    System.out.println("Float.POSITIVE_INFINITY=" + Float.NaN);

    System.out.println("Float.isFinite(3.1415926f)=" + Float.isFinite(3.1415926f));
    System.out.println("Float.isFinite(Float.NaN)=" + Float.isFinite(Float.NaN));
    System.out.println("Float.isFinite(Float.POSITIVE_INFINITY)=" + Float.isFinite(Float.POSITIVE_INFINITY));
    System.out.println("Float.isFinite(Float.NEGATIVE_INFINITY)=" + Float.isFinite(Float.NEGATIVE_INFINITY));

    System.out.println("Float.isInfinite(3.1415926f)=" + Float.isInfinite(3.1415926f));
    System.out.println("Float.isInfinite(Float.NaN)=" + Float.isInfinite(Float.NaN));
    System.out.println("Float.isInfinite(Float.POSITIVE_INFINITY)=" + Float.isInfinite(Float.POSITIVE_INFINITY));
    System.out.println("Float.isInfinite(Float.NEGATIVE_INFINITY)=" + Float.isInfinite(Float.NEGATIVE_INFINITY));

    System.out.println("Float.isNaN(3.1415926f)=" + Float.isNaN(3.1415926f));
    System.out.println("Float.isNaN(Float.NaN)=" + Float.isNaN(Float.NaN));
    System.out.println("Float.isNaN(Float.NEGATIVE_INFINITY)=" + Float.isNaN(Float.NEGATIVE_INFINITY));
    System.out.println("Float.isNaN(Float.POSITIVE_INFINITY)=" + Float.isNaN(Float.POSITIVE_INFINITY));
}

輸出如下:

Float.NEGATIVE_INFINITY=-Infinity
Float.POSITIVE_INFINITY=Infinity
Float.POSITIVE_INFINITY=NaN
Float.isFinite(3.1415926f)=true
Float.isFinite(Float.NaN)=false
Float.isFinite(Float.POSITIVE_INFINITY)=false
Float.isFinite(Float.NEGATIVE_INFINITY)=false
Float.isInfinite(3.1415926f)=false
Float.isInfinite(Float.NaN)=false
Float.isInfinite(Float.POSITIVE_INFINITY)=true
Float.isInfinite(Float.NEGATIVE_INFINITY)=true
Float.isNaN(3.1415926f)=false
Float.isNaN(Float.NaN)=true
Float.isNaN(Float.NEGATIVE_INFINITY)=false
Float.isNaN(Float.POSITIVE_INFINITY)=false

從結果可以看出,NaN是既不是有限的也不是無限的。