揭秘 C++ 中的 NaN:产生原因、特性详解及处理方法
创作时间:
作者:
@小白创作中心
揭秘 C++ 中的 NaN:产生原因、特性详解及处理方法
引用
CSDN
1.
https://blog.csdn.net/csdnnews/article/details/137580018
NaN(Not a Number)是C++中一个特殊的浮点数值,用于表示无法定义或不确定的数值结果。在编程中,特别是在进行数学计算时,了解NaN的产生原因、特性以及如何处理它,对于确保程序的正确性和稳定性至关重要。本文将深入探讨NaN的相关知识,帮助开发者更好地理解和应对这一特殊数值。
一、NaN 是如何产生的?
NaN值通常由那些无法产生确定或实数结果的操作产生,常见的场景包括:
- 零除以零
- 无穷大除以无穷大
- 零乘以无穷大
- 带相反符号的无穷级数相加
- 计算负数的平方根
- 取负数的对数
- 使用非数字操作数进行复杂的数学运算
在C++中,还可以通过以下方式显式创建NaN值:
double nanValue = std::nan("0");
double quietNan = std::numeric_limits<double>::quiet_NaN();
二、NaN 的特性
NaN的一个显著特点是其在比较时的行为。在全等运算中,NaN与其他任何值(包括它自己)相比,结果都是false。示例如下:
double nanValue = 0.0 / 0.0;
bool alwaysFalse = nanValue == nanValue; // false
bool alwaysTrue = nanValue != nanValue; // true
要判断一个值是否为NaN,可以使用以下方法:
bool isNan = nanValue != nanValue;
C++标准库从C++11开始提供了内置函数std::is_nan来检查一个数字是否为NaN。
三、NaN 对数据结构的影响
在使用关联容器(如std::set)时,NaN会导致一些特殊问题。由于NaN不满足关联容器键的严格弱排序要求,一旦容器中包含NaN值,将无法再插入其他值。例如:
std::set<double> test;
test.insert(nanValue);
test.insert(1.0); // 不会插入
test.insert(2.0); // 不会插入
四、NaN 的标准和类型
根据IEEE 754标准,NaN值分为两种类型:
- Quiet NaNs(qNaNs):允许计算继续进行而不受干扰,在算术运算中悄无声息地传播。
- Signaling NaNs(sNaNs):会触发异常,立即处理无效操作。
虽然这两种NaN类型的区别很重要,但在C++或IEEE 754标准库接口中并没有明确处理,更多地取决于底层硬件和编译器行为。
五、检查 NaN
各种数学库都提供了NaN检查函数。例如,glm库可以检查向量的各个分量是否为NaN,并返回一个布尔向量:
glm::dvec3 nanVector = someFunction();
bool isNaN = glm::all(glm::isnan(nanVector));
更推荐的做法是检查数字是否有限,这可以通过std::isfinite函数实现:
std::println("{}", std::isfinite(std::numeric_limits<double>::quiet_NaN()));
std::println("{}", std::isfinite(std::numeric_limits<double>::infinity()));
std::println("{}", std::isfinite(-std::numeric_limits<double>::infinity()));
std::println("{}", std::isfinite(0.0));
std::println("{}", std::isfinite(std::exp(1000)));
std::println("{}", std::isfinite(std::numeric_limits<double>::min()));
六、结论
在C++中处理NaN值需要了解它们的生成、属性以及对数据结构的影响。通过利用内置函数并遵循最佳实践,开发人员可以有效管理NaN值,确保软件可以优雅地处理边缘情况,并在整个计算过程中保持数值的完整性。
热门推荐
长沙重点大学排名一览表!看16所大学校友会、ESI世界排名
学生组织与领导力培养
讲好故事,电影与文学殊途同归
秦始皇的文化政策
成都周边古镇春游指南:安仁、洛带、新场等你来打卡
心悸是大病还是小病?
《黑神话:悟空》性能测试工具登场!优化得当核显都能玩!
古代冶金技术:兵器制造的变革引擎
2024年Q1中国旅游消费趋势洞察报告:万物生长,暗潮涌动
视频号矩阵运营指南:多账号协同管理的成功秘诀
5G手机如何转化为有线网络:技术原理与实践操作详解
《渔家傲:李清照笔下的海洋情怀与人生哲思》
长期吃维生素补剂不安全
血脂高胆固醇高甘油三酯高吃什么能降下来
2024年国际脉冲星研讨会在贵阳举办
香港教育与内地教育的差异
DeepSeek眼中的文成:AI笔下的山水人文之美
笔记本电脑应如何存放?
一文看懂姜萍入围阿里全球数学竞赛,及时间线
2024提前退休条件规定是怎样的
《剑风传奇》:三浦建太郎为漫画开辟的新世界
想祛痘、美白、治脱发就刷碘伏?!
跑遍主城区 探索热门景点 他们用轮椅“走”出一份西安无障碍地图
一起感受杨志刚与哥哥的兄弟情谊,事业与家庭的温馨故事
河南科技学院或将更名为“河南农林科技大学”?
海洋生物科普——梦幻水母!
总票房破4亿元,同款受欢迎,细数《好东西》的火爆与争议
小小维生素B2,却能改善多种健康问题,值得收藏!
房屋装修半包能包房屋清理吗?
卫星通信系统:结构、特点、组成与分类详解