我已经知道if(nan != nan) -> TRUE
(sqrt(-1)
非常合乎逻辑0/0
必须与if(nan > 90.0f) -> FALSE
不等。
以下代码行也是合乎逻辑的:
...nan
if(nan >= 90.0f) -> TRUE
不是数字,因此它不能大于或小于数字。
但是,我不明白为什么{{1}}?!?!
我正在使用Tasking C166编译器。
答案 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)