2013-08-27 48 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

相关问题