双倍和NaN比较的结果是什么

What is result of comparison of double and NaN?

本文关键字:结果 结果是 是什么 比较 NaN      更新时间:2023-10-16

我有以下程序:

#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之间的比较,如上例所示。

标准对此有何规定?

标准对此有何规定?

C++标准没有说明NaN上的操作如何表现。它未指定。因此,就C++而言,任何结果都是可能的和允许的。

ANSI/IEEE Std 754–1985 说:

5.7. 比较

。每个 NaN 都应该与一切事物进行比较,包括它自己。...

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

在这种情况下,

您看到的 0 表示false,因为这是流默认显示的 false。如果您想将其视为truefalse请使用std::boolalpha

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

比较浮点值,其中一个值是nan,然后x<yx>yx<=yx>=yx==y的计算结果都将为假,而x!=y值将始终为真。Andrew Koenig在Dr Dobbs网站上有一篇很好的文章。

当你考虑它时,结果不能nan,因为比较运算符需要返回一个只能有 2 个状态的布尔值。

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

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

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

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

相关文章: