NaN is not a not a number

In software development it’s crucial to be precise when you’re using terms: proper use of terms is essential for people to communicate efficiently. It’s highly important to be on the same wavelength.

One of the terms that is frequently misused is the NaN.

It has its roots in the IEEE754 standard, which defines it as a special value (actually, as we’ll see later – a set of values), that represents a result of an arbitrary evaluation that cannot or should not be represented as a particular number, or simply is not known. Eg: arcsine(2) or 0/0. This also leads us to another discovery: NaN value actually is of a numeric type! But just a special number that is treated and represented in its own very special way.

So, again, NaN as per the IEEE754 standard is not any arbitrary value of a non-numeric type, but actually is a number! What it means is that one better not say a string "foo" is a NaN, since it’s not.

It gets even more interesting if you check how the NaN values are represented. For double precision (64 bit long) floating point numbers (that are used to represent a Number data type in javascript and few other languages) a special range with the exponent equal to 0x7FF is reserved to represent NaN values. Which means that the other 53 bits of a number can be of any value (unless when a fraction equals to 0x0 that is reserved for +Infinity and -Infinity). So having a double precision floating point number we can construct a NaN value in 9007199254740990 (2 power 53 minus 2) distinct ways. That’s a lot isn’t it.

To summarise: if you use NaN as a substitution for simply anything that is not a number (a string, a null value, an object, etc) – please stop. If you don’t – please share the knowledge and help other people be as precise as you.

Useful links: