Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In which case could "a != a" return "true"?

java.lang.Math#min(double, double):

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;
}

In which case could a != a return true? It seems that it's when a is NaN, but I can't imagine an example. Could you please provide one?

like image 590
sp00m Avatar asked Dec 26 '22 21:12

sp00m


1 Answers

A simple example is

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() does see NaN as equal

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

With multiple threads this is possible for any type and value. e.g.

if (a != /* another thread changes 'a' */ a) {
    // a thread changed a while you were looking at it.
like image 125
Peter Lawrey Avatar answered Dec 28 '22 11:12

Peter Lawrey