Win a copy of Kotlin in Action this week in the Kotlin forum!
programming forums Java Java JSRs Mobile Certification Databases Caching Books Engineering Languages Frameworks Products This Site Careers Other all forums
this forum made possible by our volunteer staff, including ...
Marshals:
Sheriffs:
Saloon Keepers:
Bartenders:

# 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: 9080
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: 9080
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

 It is sorta covered in the JavaRanch Style Guide.