Java中的NaN Constant Magic

时间:2012-09-28 04:06:19

标签: java

  

可能重复:
  Why does Double.NaN==Double.NaN return false?

NaN =“NaN”代表“不是数字”。如果浮点运算有一些输入参数导致操作产生一些未定义的结果,则会产生“Nan”。例如,0.0除以0.0是算术上未定义的。取负数的平方根也是未定义的。

我试图在Java中使用NaN Constant

public class NaNDemo {
    public static void main(String s[]) {
        double x = Double.NaN;
        double y = Double.NaN;

        System.out.println((x == y));
        System.out.println("x=" + x);
        System.out.println("y=" + y);
    }
}

输出

false
x=NaN
y=NaN

那么为什么x == y是假的?

4 个答案:

答案 0 :(得分:3)

NaN是一个概念,而不是值或数字。由于该概念可以表示多个非实数值(虚数,0/0等),因此任何特定的NaN等于任何其他NaN都没有意义。

同样地,你不能说Double::NEGATIVE_INFINITY等于它自己,因为无穷大也不是一个数字。

答案 1 :(得分:1)

如果任一操作数为NaN,则等于运算符==返回false。

JSL对NaN说:

  
      
  • 如果其中一个或两个操作数均为NaN(§15.20.1),则数值比较运算符<,< =,>和> =返回false。
  •   
  • 如果任一操作数为NaN,则等于运算符==返回false。
  •   
  • 特别是,如果x或y为NaN,则(x = y)将为假。
  •   
  • 如果任一操作数为NaN(§15.21.1),则不等式运算符!=返回true。
  •   
     

特别是,当且仅当x是NaN时,x!= x才为真。

答案 2 :(得分:0)

两个NaN值不能相等。你不知道它们代表什么未定义的值。而且你也不知道它们是如何表示的。

引用JLS -

  

特殊号码NaN (not-a-number)是无序的并且具有   以下字符:

     
      
  • 如果其中一个或两个操作数均为NaN,则数值比较运算符<,< =,>和> =始终返回false。
  •   
  • 如果任一操作数为NaN,则等于运算符==返回false。
  •   
  • 如果任一操作数为NaN,则不等式运算符!=返回true。
  •   

如果你这样定义: -

    Double a = new Double(Double.NaN);
    Double b = new Double(Double.NaN);

    if (a == b) {
        System.out.println("true");   /** You will get true **/
    }

答案 3 :(得分:0)

NaN - 非数字在使用NAN数字进行操作时没有任何意义。所以不能相等。