### The Issue

If you want to detect if a double (System.Double) or float (System.Single) is ?not a number? or NaN you cannot use something like this:

if (myDouble == double.NaN) { /* do something */ }

It will always be false.

Sounds crazy? Try this:

double myDouble = double.NaN; Console.WriteLine("myDouble == double.NaN : {0}", myDouble == double.NaN);

The result is:

**myDouble == double.NaN : False**

You can see that myDouble was explicitly set the value of double.NaN, yet in the next line it is returning false.

### The Solution

If you want to test for a floating point value being Not a Number you to use IsNan() which is a static method on System.Double and System.Single. Here is the first example re-written to use the static method. It will now work correctly:

if (double.IsNan(myDouble) { /* do something */ }

If we re-write our other example:

double myDouble = double.NaN; Console.WriteLine("double.IsNaN(myDouble) : {0}", double.IsNaN(myDouble));

We get the expected result too:

**double.IsNaN(myDouble) : True**

### The Reason

According to Wikipedia: *In **computing**, NaN, which stands for Not a Number, is a value or symbol that is usually produced as the result of an operation on invalid input operands, especially in *

*floating-point*

*calculations. For example, most*

*floating-point units*

*are unable to explicitly calculate the square root of negative numbers, and will instead indicate that the operation was invalid and return a NaN result. NaNs may also be used to represent missing values in computations.*

It goes on to say: *A NaN does not compare equal to any floating-point number or NaN, even if the latter has an identical representation. One can therefore test whether a variable has a NaN value by comparing it to itself, thus if x = x gives false then x is a NaN code.*

This is why (double.NaN == double.NaN) always results in false. And it is also how the .NET framework detects the NaN value in the IsNan() method.

public static bool IsNaN(double d) { return (d != d); }