5 ms·
NaN literally means "not a number." Lots of things aren't numbers. The letter a is not a number. The square root of negative 1 is not a number (at least, not on
by cwyers 12y ago
NaN literally means "not a number." Lots of things aren't numbers. The letter a is not a number. The square root of negative 1 is not a number (at least, not one representable in floating point math). a is not equal to the square root of negative 1.
- kazinator 12y agoI don't understand your point. This is not a number: char *p = "abc"; Yet, this yields true: p == p The square root of -1 is easily representable in floating math. You just need two floats to make a complex.
- hueving 12y agoThe point is that you can have very different things that are not a number. It's not safe to say that multiple things that are not a number are equal.
- kazinator 12y agoThe values of two expressions that evaluate the same variable are not "multiple things".
- cwyers 12y agoOkay, but while "abc" is not a number, it is also the string "abc". NaN is special in that all it tells you is that the value is not a number -- it doesn't tell you what it is. In order to return a true value from an equality test, it isn't enough to know that both values are not a number, you have to know what they actually are.
- kazinator 12y agoIf it is not known what is in the p variable, then the variable is indeterminate; it has exactly the same status as a variable that has not been initialized. In this case, the behavior upon accessing the variable should be undefined. I agree with making accesses of NaN-valued variables undefined behavior, so that not comparing equal is then a possible consequence of undefined behavior. I don't agree with defining the unequal comparison as the required behavior. To define the behavior is tantamount to the recognition that a NaN is something: an object. A variable can have a defined value which is that something, and that value must obey the Law of Identity.
- pcl 12y agoIn practice, NaN as a literal means that the outcome of a mathematical statement is not expressible. So, the letter 'a' is not equal to NaN (with either two or three = signs). NaN, in other words, has a special meaning. Dismayingly, JavaScript's isNaN() function diverges from this special meaning, and does something close to what you said -- it tests to see if something is at least almost a number. So isNaN(13/0) and isNaN('foo') both evaluate to 'true', whereas isNaN('1') and isNaN(42) both evaluate to 'false'.
- flomo 12y agoJavascript type coercions might make sense if you realize it was originally designed for a close integration with HTML forms using a simplified proto-DOM ("Level 0"). The idea was more like "isNaN(myForm.myField)"? For all I know, the above might actually still work. But either way, that explains Javascript type conversion logic.