2012-09-28 37 views
5

恆魔術可能重複:
Why does Double.NaN==Double.NaN return false?楠的Java

NaN的 = 「南」 代表 「不是一個數字」。如果浮點操作有一些輸入參數導致操作產生一些未定義的結果,則產生「Nan」。例如,0.0除以0.0在算術上是未定義的。取一個負數的平方根也是不明確的。

我試圖用楠的Java

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是假的常量?

+2

看看http://stackoverflow.com/a/471314/751634 –

+0

或更直接地,http://stackoverflow.com/questions/8819738/why-does-double-nan-double-nan-return -假。 – AerandiR

+0

謝謝@ jenoosia,這就是我正在尋找的 –

回答

3

NaN是一個概念,而不是一個值或數字。由於這個概念可以表示多個非實數值(虛數,0/0等),所以說任何特定的NaN都等於任何其他NaN是沒有意義的。

同樣,你不能說Double::NEGATIVE_INFINITY等於自己,因爲無窮大也不是一個數字。

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 **/ 
    } 
+0

這是不是真的正確,它相當於Double.longBitsToDouble(0x7ff8000000000000L)返回的值。 – CloudyMarble

+0

@MeNoMore ..對於哪部分你說這個..我猜對了第二行 - >你不知道他們代表什麼未定義的值..可能你是對的,因爲我不確定這個.. –

+0

我的意思是表示部分 - >「你不知道它們是如何表示的」。你現在可能沒有把帽子引向NaN,但是Java聲明瞭他們的價值,你可以告訴他們你會得到NaN,這是他們的代表。 – CloudyMarble

1

如果任一操作數是NaN,則相等運算符==返回false。

JSL sayes約楠:

  • 數值比較運算符<,< =,>,和> =返回false,如果任一個或兩個操作數爲NaN(§15.20.1)。
  • 如果任一操作數是NaN,則相等運算符==返回false。
  • 特別是,如果x或y是NaN,(x = y)將是錯誤的。
  • 不等式運算符!=如果任一操作數是NaN(§15.21.1),則返回true。

特別是,x!= x是當且僅當x是NaN時爲真。

0

NaN - 不是一個數字沒有任何意義,當做一個與NAN number.so操作不相稱。