【问题标题】:Comparing nan (greater and greater equal)比较 nan(大于等于)
【发布时间】:2013-05-16 01:31:43
【问题描述】:

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

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

if(nan > 90.0f) -> FALSE

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

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

我正在使用 Tasking C166 编译器。

【问题讨论】:

  • @Patashu c 在标签中。我不记得在 c tho 中使用过 NAN ._.
  • 查看生成的程序集。我怀疑编译器将其“优化”为if (!(nan < 90.0f))。由于所有涉及 NaN 的比较 [除了!=] 返回 false,这将导致观察到的行为。

标签: c compare nan


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我只能说 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)
    

    【讨论】:

    • 如果按位完全相同,那么您将如何区分两者?如果有的话,它完全相反。它们的位模式不同,但是内置例程确实返回了其他内容。
    • nan 绝对不是由 01000010 10110100 00000000 00000000 代表,而是由 x1111111 1xxxxxxx xxxxxxxx xxxxxxx1 代表
    • 我在 ideone 上试了一下,得到了“1.0/0.0>90.0f==true”,所以这不仅仅是 Rudi 的问题。这可能是编译器优化的问题,但我想看看何时发生。
    • 在我看来 1.0/0.0 等于 inf,而不是 nan...因此对于这个比较来说 true 是可以的。
    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2012-06-04
    • 2022-07-02
    • 2011-10-22
    相关资源
    最近更新 更多