【问题标题】:What is result of comparison of double and NaN?double 和 NaN 的比较结果是什么?
【发布时间】:2016-08-20 00:05:09
【问题描述】:

我有以下程序:

#include <iostream>
#include <cmath>

int main() {
    double a = 1;
    double b = nan("");

    std::cout << (a > b) << std::endl;
    std::cout << (b > a) << std::endl;

    return 0;
}

输出:

0
0

一般来说,从nan - not a number 的含义来看,任何对nan 的操作基本上都是毫无意义的。从我在互联网上找到的IEEE-754,我发现如果在 FPU 中至少一个操作数是nan,结果也是nan,但我没有发现正常值和nan 之间的比较,如上例所示。

标准对此有何评论?

【问题讨论】:

  • FPU 函数和比较的逻辑结果可能是两个不同的东西。你的反汇编说明了什么?
  • 您的代码可能(或可能不会)缺少== 比较。您确实检查了&lt;&gt;,但没有检查==。也许您打算使用&lt;&gt;=&lt;=&gt;

标签: c++ c++11 nan


【解决方案1】:

0 在这里表示错误。 Nan不等于或不与任何值相当,因此运算结果为false(0)。

【讨论】:

  • 你说的很合乎逻辑,但是你能在定义的地方给出任何参考吗?
【解决方案2】:

在这种情况下,您看到的 0 表示 false,因为这就是流默认显示为 false 的内容。如果您想将其视为truefalse,请使用std::boolalpha

std::cout << std::boolalpha << (a > b) << std::endl;

Whey 比较浮点值,其中值之一是 nan 然后 x&lt;yx&gt;yx&lt;=yx&gt;=yx==y 将全部评估为 false,而 x!=y 将始终为 true . Andrew Koenig 在Dr Dobbs 网站上有一篇很好的文章。

仔细想想,结果不可能是nan,因为比较运算符需要返回一个只能有两种状态的布尔值。

【讨论】:

  • 您能否提供定义此行为的任何参考(我的意思是 NaN 与任何其他正常值之间的比较操作)?
  • @Alex - 我提供了一篇文章的链接
【解决方案3】:

标准是怎么说的?

C++ 标准没有说明对 NaN 的操作的行为方式。未指定。因此,就 C++ 而言,任何结果都是可能的并且是允许的。

ANSI/IEEE 标准 754–1985 说:

5.7。比较

... 每个 NaN 都应与包括自身在内的所有内容进行无序比较。 ...

unordered 的确切含义在同一部分的表 4 中显示。但简而言之,这意味着如果任何操作数为 NaN,则比较将返回 false,除了 != 应返回 true。

【讨论】:

    【解决方案4】:

    嗯,除了@user2079303 很好的答案之外,还有两个 NaN:安静的 NaN 和信令 NaN。您可以在您的平台上检查 std::numeric_limits&lt;T&gt;::has_signaling_NaN 是否发出 NaN 可用的信号。如果为真且值包含std::numeric_limits&lt;T&gt;::signaling_NaN,则

    当信号 NaN 用作算术表达式的参数时,可能会引发适当的浮点异常并且 NaN 被“静默”,即表达式返回静默 NaN。

    要真正获得 FP 异常,您可能需要设置 FPU 控制字(对于 x87 单元)或 MXCSR 寄存器(对于 SSE2+ 单元)。这适用于 x86/x64 平台,请查看您的平台文档以了解类似功能

    【讨论】:

      猜你喜欢
      • 2015-09-22
      • 2011-10-07
      • 1970-01-01
      • 2012-09-20
      • 2016-06-04
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多