我已经知道了if(nan != nan) -> TRUE
,这很符合逻辑(sqrt(-1)
,必须不等于0/0
)。
以下代码行也是合乎逻辑的:
if(nan > 90.0f) -> FALSE
...nan
不是数字,因此它不能大于或小于数字。
但是,我不明白为什么if(nan >= 90.0f) -> TRUE
?!?!
我正在使用 Tasking C166 编译器。
这似乎是一个编译器错误[1]。您应该将其报告给 Tasking。
[1] 从我所看到的 ( http://www.tasking.com/products/c166/ ) 来看,Tasking 并未声称符合 IEEE-754,因此这种行为实际上可能并不与他们发布的文档相反。然而,这有悖于常识和良好的品味。
我只能说 nan 可能由 01000010 10110100 00000000 00000000 表示
如果是这样,C 可能会逐位比较并找出 90.0f 实际上等于 nan。那是我唯一的猜测。
编辑:来自维基百科:与 NaN 的比较总是返回无序的结果,即使与自身进行比较也是如此。比较谓词是信令或非信令,信令版本表示此类比较的无效异常。等式和不等式谓词是无信号的,因此 x = x 返回 false 可用于测试 x 是否是安静的 NaN。如果其他标准比较谓词接收到 NaN 操作数,则它们都是信号,该标准还提供这些其他谓词的非信号版本。谓词 isNaN(x) 确定一个值是否为 NaN,并且永远不会发出异常信号,即使 x 是信号 NaN。
我刚刚在 Dev-C++ 4.9.9.2 中运行了上面的同一行,NAN >= 90.0f 返回 false。检查您的编译器是否打开了快速数学选项,这可能会导致比较 NAN 值时出错。在我的 math.h 中,NAN 是这样定义的:
#define NAN (0.0F/0.0F)