This week's book giveaway is in the Testing forum.We're giving away four copies of The Way of the Web Tester: A Beginner's Guide to Automating Tests and have Jonathan Rasmusson on-line!See this thread for details.
Win a copy of The Way of the Web Tester: A Beginner's Guide to Automating Tests this week in the Testing forum!

# NaN

Mathew Kuruvilla
Ranch Hand
Posts: 145
1: Double a = new Double(Double.NaN);
2: Double b = new Double(Double.NaN);
3:
4: if( Double.NaN == Double.NaN )
5: System.out.println("True");
6: else
7: System.out.println("False");
8:
9: if( a.equals(b) )
10: System.out.println("True");
11: else
12: System.out.println("False");
I have not read the stuff about NaN. The above code is printing False
True.
What gives?
Is there anything else that I need to know about NaN?

Marilyn de Queiroz
Sheriff
Posts: 9067
12

Mathew Kuruvilla
Ranch Hand
Posts: 145
I have read all the relevant chapters in Khalid's book, (am due to take the exam on the day after tomorrow) and I never came across NaN. So, I cannot read about it.

Mike Cunningham
Ranch Hand
Posts: 130
NAN (not a number) is unordered. Comparing it to any other number, including itself (using the == comparison operator), always yields false. If you use the equals() method overridden by double from the object class it returns true because NAN is a constant. I'm not sure if my logic is accurate...but I was looking over the same subject this evening. Also, I was thinking that constants are stored on the heap. If that's the case...can someone confirm.
Thanks.

Marilyn de Queiroz
Sheriff
Posts: 9067
12
NaN is unordered, so the numerical comparison operators <, <=, >, and >= return false if either or both operands are NaN (�15.20.1). The equality operator == returns false if either operand is NaN, and the inequality operator != returns true if either operand is NaN (�15.21.1). 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.JLS
Floating-point operators produce no exceptions (�11). An operation that overflows produces a signed infinity, an operation that underflows produces a denormalized value or a signed zero, and an operation that has no mathematically definite result produces NaN. All numeric operations with NaN as an operand produce NaN as a result. As has already been described, NaN is unordered, so a numeric comparison operation involving one or two NaNs returns false and any != comparison involving NaN returns true, including x!=x when x is NaN.
JLS

Also the API for the Math class