双倍和NaN比较的结果是什么
What is result of comparison of double and NaN?
我有以下程序:
#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。如果您想将其视为true
或false
请使用std::boolalpha
:
std::cout << std::boolalpha << (a > b) << std::endl;
比较浮点值,其中一个值是nan,然后x<y
、x>y
、x<=y
、x>=y
和x==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 平台也是如此,请查看您的平台文档以获取类似功能
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- std::chrono::duration::count函数的实际结果类型是什么
- 术语的计算结果不是采用0个参数的函数
- 错误 C2064:术语的计算结果不是采用 3 个参数的函数
- C++:术语的计算结果不是采用 1 个参数的函数
- ZTV,ZTS,ZTI 在 gdb x/nfu "vtable_address" 的结果中是什么意思?
- 错误 C2064:term 的计算结果不是采用 1 个参数的函数 - 关于线程的一些东西
- 如何打印返回值的结果?我是一个初学者学习C++
- 即使在C 中越过初始化阵列的极限后,结果也是如此
- 使用FP:快速导致错误的VC 结果(不仅仅是不准确)结果 - 这是编译器错误
- 我收到此错误:错误 c2064:term 的计算结果不是采用 0 个参数的函数,但我不明白为什么
- C++时间()给我的结果几乎是随机的
- 三元运算符的结果不是右值
- 为什么"decltype(i+j)"的结果不是右值引用?
- 简单的代码,看似随机的结果——这是由于过时的引用造成的吗
- wxwidgets Bind()项的计算结果不是在event.h中使用1个参数的函数
- 我正在尝试用C++制作一个费用计算器,我得到了错误C2064:term的计算结果不是一个带1个参数的函数
- 取消引用无效指针但不使用结果是否是C++中的未定义行为
- 字符* 到字符串 c++(结果不是预期的)
- 错误C2064:术语的计算结果不是一个带1个参数的函数,我该如何克服这个错误