objective-c - isNan( ) 是如何工作的?

标签 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;但它是如何实现的。因此,请将您的答案引导至实际的低级别实现。

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

最佳答案

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

A comparison with a NaN always returns an unordered result even when comparing with itself.

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

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

关于objective-c - isNan( ) 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22929384/

相关文章:

python - 将 nans 替换为移动窗口的正态分布

objective-c - Objective C 没有抛出足够多的错误?

c - 当缓冲区太小无法容纳一些数据时会发生什么

c - 如何使用用户的输入创建表,表的数量根据用户先前指定的输入而变化?

python - 如何在 Dataframe 中删除最后一个不是 NaN 的值?

Java 数学 - 测试 NaN

objective-c - 可以将另一个项目添加到现有枚举类型吗?

ios - 在 Core Data 中执行子提取时,修改父上下文中的托管对象是否会向下传播到子上下文?

objective-c - NSURLConnection 在约 5 分钟后忽略服务器响应——没有超时

c++ - 插入队列期间内存泄漏