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**?

## Answer

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,, and`x!=x`

is`true`

if and only if`x`

is`NaN`

`(x<y) == !(x>=y)`

will be`false`

if`x`

or`y`

is`NaN`

.