isNan()是如何工作的?

时间:2014-04-08 06:36:41

标签: objective-c c nan math.h

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;但它是如何实施的。因此,请指导您对实际低级别实施的回答。

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:2)

CF http://en.wikipedia.org/wiki/NaN

  

与NaN进行比较时,即使与自身进行比较,也始终会返回无序结果。

意味着NaN总是与你的比较不同:)

我认为编译器/ CPU有自己的方法来检查这个特殊值,也许有人可以给出比我更好的答案...