比较nan(越大越大)

时间:2013-05-21 10:06:17

标签: c compare nan

我已经知道if(nan != nan) -> TRUE (sqrt(-1)非常合乎逻辑0/0必须与if(nan > 90.0f) -> FALSE 不等。

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

...nan

if(nan >= 90.0f) -> TRUE不是数字,因此它不能大于或小于数字。

但是,我不明白为什么{{1}}?!?!

我正在使用Tasking C166编译器。

2 个答案:

答案 0 :(得分:1)

这似乎是编译器错误[1]。你应该把它报告给Tasking。

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

答案 1 :(得分:-3)

我只能说,nan可能代表着 01000010 10110100 00000000 00000000

如果是这样,C可能会逐位比较,并发现90.0f实际上等于nan。 这是我唯一的猜测。

修改:来自wikipedia: 与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)