浮点数和双NaN(非数字)值

时间:2014-03-23 11:38:38

标签: java java-ee floating-point double-precision

我正在阅读JLS8 4.2.3,我找到Float NaNDouble NaN的概念。当我打开FloatDouble类的源代码时,尝试了以下代码:

1st condition:
if (Float.NaN == Float.intBitsToFloat(0x7fc00000)) 
    System.out.println("Both are equal");
}

2nd condition:
if (Float.NaN == (0.0f / 0.0)) {
    System.out.println("Equal");
}

根据文件: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)}.
 */

那么为什么我的两个条件都是false。在2nd condition的日食中,我得到了warning: Dead Code

Double NaN相同。

3 个答案:

答案 0 :(得分:3)

这是因为根据定义,NaN不等于任何东西。它用于模拟某个东西,我们所知道的就是它不是一个数字。

想象一下:椅子是NaN,你的屏幕也是NaN(不是数字),但你的椅子与你的屏幕不一样。

同样地,鉴于简不是你的母亲而约翰不是你的母亲,坚持简和约翰必须是同一个人是毫无意义的。

答案 1 :(得分:2)

因为浮点将NaN == NaN定义为false。 (这是有道理的; 0/0acos(2)都是NaN,但这并不代表他们在任何有用的意义上彼此相等。)

使用Float.isNaN()确定某些内容是否为NaN

答案 2 :(得分:2)

作为其他答案的补充,您可以使用以下任一方式测试float是否为NaN:

Float.isNaN(myFloat);

或:

Float.compare(Float.NaN, myFloat) == 0

Double.NaN也是如此;并且Double类有类似的方法。