版权声明:欢迎转载,请注明作者和出处 https://blog.csdn.net/baichoufei90/article/details/84562718
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是既不是有限的也不是无限的。