必须包含并使用std::isnan;它支持float/double/long double重载,不可用==判断NaN,禁用-ffast-math,非浮点类型会编译失败,嵌入式环境需手动比特位判断。
std::isnan 能直接用,但头文件和命名空间容易漏
std::isnan 是 C++11 起标准库提供的函数,用来检测一个浮点数是否为 NaN(Not a Number)。但它不在 或 的“默认可见”范围内——很多人写了 isnan(x) 却没加 std:: 前缀,或没包含正确头文件,结果编译失败或调用到 C 版本的 isnan(行为不一致)。
必须显式包含 ,并使用 std::isnan:
#include
#include
double x = std::nan("");
if (std::isnan(x)) {
std::cout << "x is NaN\n";
}
- 不要只写
isnan(x):C++ 标准不保证它在全局命名空间中可用 - 不要用
:那是 C 头文件,可能引入宏而非重载函数,对float/long double参数行为不可靠 -
std::isnan有重载版本,支持float、double、long double,自动匹配类型
NaN 不等于任何值,包括它自己 —— 所以不能用 == 判断
这是最常踩的坑:有人写 if (x == x) 来“反向判断” NaN,逻辑没错,但可读性差、意图模糊,且容易被优化器或静态分析工具误报。更糟的是,有人真写 if (x == std::nan("")),这永远为 false —— 因为所有 NaN 都不相等。
- NaN 的 IEEE 754 定义决定了:
x == x为 false 当且仅当x是 NaN(前提是未开启 -ffast-math 等破坏 IEEE 语义的编译选项) - 但
std::isnan(x)是语义明确、意图清晰、且被编译器充分优化的标准方式 - 禁用
-ffast-math:该选项可能让std::isnan返回错误结果,或让x != x优化掉
std::isnan 对非浮点类型会编译失败,别传 int 或指针
std::isnan 只接受浮点类型。如果误传 int、bool、自定义类或空指针,编译器会报错,典型信息如:no matching function for call to 'isnan(int)'。
立即学习“C++免费学习笔记(深入)”;