将数字与NaN进行比较的结果是什么
What is the result of comparing a number with NaN?
以为例
bool fun (double a, double b) {
return a < b;
}
如果任何一个参数是NaN,fun
将返回什么?这是未定义/实现定义的行为吗?
其他关系运算符和相等运算符会发生什么?
任何与NaN的比较(与"!="的比较除外(都返回false。
这是我构建的一个表:
+Dbl_Nan 0_Nan Inf_Nan NaN_NaN +Dbl_Inf +Dbl_-Inf Inf_-Inf Inf_Inf
-----------------------------------------------------------------------
> | False False False False False True True False
< | False False False False True False False False
== | False False False False False False False True
!= | True True True True True True True False
点击此处了解为什么NaN总是错误的基本原理。
C++标准只说:
[expr.rel]/5如果两个操作数(转换后(都是算术或枚举类型,则如果指定的关系为true,则每个运算符应产生
true
,如果为false,则产生false
。
所以基本上,如果a
小于b
,则a < b
为真。
然而,该实现方式可以通过numeric_limits::is_iec559
声明符合浮点运算的IEC 559(即IEEE 754标准(。然后,它受第5.7节和表4中的标准管辖,该标准要求除涉及NaN
的!=
之外的所有比较都报告false
。涉及NaN
的!=
报告true
错误。
实际上没有-NaN
这样的东西,尽管NaN值确实携带了一个符号位和一个有效载荷。但出于算术目的,NaN就是NaN。
与NaN的任何相等或有序比较都是错误的。
相关文章:
- 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个参数的函数,我该如何克服这个错误