Java-NaN和INFINITY
阿新 • • 發佈:2018-12-09
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是既不是有限的也不是無限的。