Skip to content

How can “while (i == i) ;” be a non-infinite loop in a single threaded application?

I just got a question that I can’t answer.

Suppose you have this loop definition in Java:

while (i == i) ;

What is the type of i and the value of i if the loop is not an infinite loop and the program is using only one thread?


double i = Double.NaN;

The API for Double.equals() spells out the answer: “Double.NaN==Double.NaN has the value false”. This is elaborated in the Java Language Specification under “Floating-Point Types, Formats, and Values“:

NaN is unordered, so the numerical comparison operators <, <=, >, and >= return false if either or both operands are NaN. The equality operator == returns false if either operand is NaN, and the inequality operator != returns true if either operand is NaN. In particular, x!=x is true if and only if x is NaN, and (x<y) == !(x>=y) will be false if x or y is NaN.