isNan在iOS SDK中定义如下,math.h如下,
#define isnan(x) \
( sizeof(x) == sizeof(float) ? __inline_isnanf((float)(x)) \
: sizeof(x) == sizeof(double) ? __inline_isnand((double)(x)) \
: __inline_isnanl((long double)(x)))
内联函数就是这样,
__header_always_inline int __inline_isnanf(float __x) {
return __x != __x;
}
__ header_always_inline只是强制编译器使函数确实内联。
在内联函数中实际做了什么对我的眼睛来说是相当回避的。
return __x != __x;
这条线做什么?如何验证参数是否为NaN?
修改
这里的问题是不为什么NaN不等于NaN;但它是如何实施的。因此,请指导您对实际低级别实施的回答。
非常感谢任何帮助。感谢。
答案 0 :(得分:2)
CF http://en.wikipedia.org/wiki/NaN
与NaN进行比较时,即使与自身进行比较,也始终会返回无序结果。
意味着NaN总是与你的比较不同:)
我认为编译器/ CPU有自己的方法来检查这个特殊值,也许有人可以给出比我更好的答案...