在哪种情况下可以“a!= a”返回“true”?
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,但我无法想象一个例子。你能提供一个吗?
一个简单的例子是
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.
你的第二点非常有趣...... JLS是否要求在同一个表达式中每次出现“volatile a”都会导致单独的读取操作?如果不是,那么这只是特定实现的人为因素。 –
@MarkoTopolnik我相信每次访问都是不断访问的,直到JIT优化代码,在这一点上,volatile仍然是单独访问。 –
由于'Double.NaN'是一个常量,我感到非常不安,即'Double.NaN!= Double.NaN'尽管...'Double.NaN'是一个单一的*非数字*实例,因此我会认为“不是一个数字==不是一个数字”,就像“香蕉==香蕉”一样。但是,是的,显然不是,无论如何,谢谢';)' – sp00m
一个永远等于一个不管是什么,该行不执行任何操作。 我很惊讶你的IDE不称它为不可达代码。 – tom
@ tommycake50错了。看下面的答案。比较NaNs的相等性总是返回false。 –
答案出现在问题代码的注释中;-) –