# Please explain the concept of Float.Nan

Rajesh k Jha
Ranch Hand
Posts: 72
when i run this programme it outputs "false and F3=Nan" While answer says it should be f=4.2.
I am a bit confused which one is right and how, I just went through all the detail of Float.Nan and found that f=4.2 is right but why output is coming like F=Nan,

Jason Irwin
Ranch Hand
Posts: 327
How are you running the code? Assertions on or off?

f2 is NaN (line 5, f2=f1).

With assertions off, the "assert" statement won't do anything.
f3 become 1.5
Then f3+f2 is i.1 + NaN which is always NaN.

If you run with assertions on, you'll get a different answer as the assert will cause an axception (NaN==NaN is false).

Is this from K&B? You should quote your sources.

Nitish Bangera
Ranch Hand
Posts: 537
If assertions are on then f = 4.2 is the answer. If its not then f = NaN. use java -ea AssertTest for f = 4.2

Lucas Smith
Ranch Hand
Posts: 808
1
You must notice that:
float f1=Float.NaN;
float f2=f1;
f1==f2 => FALSE

Jesper de Jong
Java Cowboy
Saloon Keeper
Posts: 15216
36
Section 15.21.1 of the Java Language Specification:
Floating-point equality testing is performed in accordance with the rules of the IEEE 754 standard:

• If either operand is NaN, then the result of == is false but the result of != is true. Indeed, the test x!=x is true if and only if the value of x is NaN. (The methods Float.isNaN and Double.isNaN may also be used to test whether a value is NaN.)
• Positive zero and negative zero are considered equal. Therefore, -0.0==0.0 is true, for example.
• Otherwise, two distinct floating-point values are considered unequal by the equality operators. In particular, there is one value representing positive infinity and one value representing negative infinity; each compares equal only to itself, and each compares unequal to all other values.

• Subject to these considerations for floating-point numbers, the following rules then hold for integer operands or for floating-point operands other than NaN:
• The value produced by the == operator is true if the value of the left-hand operand is equal to the value of the right-hand operand; otherwise, the result is false.
• The value produced by the != operator is true if the value of the left-hand operand is not equal to the value of the right-hand operand; otherwise, the result is false.
•