1

我已经知道了if(nan != nan) -> TRUE,这很符合逻辑(sqrt(-1),必须不等于0/0)。

以下代码行也是合乎逻辑的:

if(nan > 90.0f) -> FALSE

...nan不是数字,因此它不能大于或小于数字。

但是,我不明白为什么if(nan >= 90.0f) -> TRUE?!?!

我正在使用 Tasking C166 编译器。

4

2 回答 2

1

这似乎是一个编译器错误[1]。您应该将其报告给 Tasking。

[1] 从我所看到的 ( http://www.tasking.com/products/c166/ ) 来看,Tasking 并未声称符合 IEEE-754,因此这种行为实际上可能并不与他们发布的文档相反。然而,这有悖于常识和良好的品味。

于 2013-05-21T14:00:20.907 回答
-3

我只能说 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)
于 2013-05-21T10:50:02.460 回答