Java-NaN和INFINITY

版权声明:欢迎转载,请注明作者和出处 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是既不是有限的也不是无限的。

猜你喜欢

转载自blog.csdn.net/baichoufei90/article/details/84562718