2013-08-27 51 views
4

java.lang.Math#min(double, double)在哪種情況下可以「a!= a」返回「true」?

public static double min(double a, double b) { 
    if (a != a) return a; // a is NaN 
    if (a == 0.0d && b == 0.0d && Double.doubleToLongBits(b) == negativeZeroDoubleBits) return b; 
    return (a <= b) ? a : b; 
} 

在這種情況下,可以a != a返回true?它似乎是a是NaN,但我無法想象一個例子。你能提供一個嗎?

+0

一個永遠等於一個不管是什麼,該行不執行任何操作。 我很驚訝你的IDE不稱它爲不可達代碼。 – tom

+1

@ tommycake50錯了。看下面的答案。比較NaNs的相等性總是返回false。 –

+3

答案出現在問題代碼的註釋中;-) –

回答

10

一個簡單的例子是

double d = Double.NaN; // or 
double d = 0.0/0.0; // or 
double d = Double.POSITIVE_INFINITY + Double.NEGATIVE_INFINITY; 
if (Double.isNaN(a)) { // tests if a != a 
    // do something 

BTW Double.compare()不看爲NaN等於

if (Double.compare(d, d) == 0) // always. 

多線程,這是可能的任何類型和值。例如

if (a != /* another thread changes 'a' */ a) { 
    // a thread changed a while you were looking at it. 
+0

你的第二點非常有趣...... JLS是否要求在同一個表達式中每次出現「volatile a」都會導致單獨的讀取操作?如果不是,那麼這只是特定實現的人爲因素。 –

+0

@MarkoTopolnik我相信每次訪問都是不斷訪問的,直到JIT優化代碼,在這一點上,volatile仍然是單獨訪問。 –

+1

由於'Double.NaN'是一個常量,我感到非常不安,即'Double.NaN!= Double.NaN'儘管...'Double.NaN'是一個單一的*非數字*實例,因此我會認爲「不是一個數字==不是一個數字」,就像「香蕉==香蕉」一樣。但是,是的,顯然不是,無論如何,謝謝';)' – sp00m

0

如果是NAN和楠例如被零除

min(0.0f/0.0f, 0.0f)

+4

1f/0f是正無窮大,而不是NaN – Joni

+0

感謝您指出 – uncletall

相關問題