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.


The value of i is then Invalid. "Not a Number".

After some googling, i found out that you CAN have NaN ( Not a Number ) in Java! So, a Float Pointing number is the Data Type and the Value is NaN. See here


double i = Double.NaN;

NaN is not equal to anything, including itself.


float i = Float.NaN;
while(i == i) ;
System.out.println("Not infinite!");