揭秘 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值,确保软件可以优雅地处理边缘情况,并在整个计算过程中保持数值的完整性。
热门推荐
医生说 《中老年人为何需要补充氨糖》
不只是蔬菜!糖尿病患者如何聪明选择蛋白质?望你早做了解
中老年人缺这类营养,糖尿病、心脏和癌症就等着你
学习能力评估怎么进行?
怎样用塔罗牌看星座运势?如何通过塔罗牌解读星座运势?
处方药有哪些常见的类型
如何避免隧道“杀手”?记住这些,关键时刻能保命
洞察美股基本面:多维度剖析与股价关联之谜
法官说“典”|《民法典》100问——最贴近百姓生活的100个问题(总则编)
小镇做题家:他们拼尽所有,只为换得普通的剧本
抗氧化、保护心血管、延缓衰老?就藏在你常吃的这种食物里
你真的会用iPhone备忘录吗?原来还有这些实用技巧
2025年外贸交易收款方式、出口收汇结汇流程、风险防范最新解析
3次模拟考,哪次难度最接近高考?
实现人生价值
iOS 16.6正式版用户反馈总结
高中英语怎么提高成绩,高手养成记
速溶咖啡:从生产到健康影响的全面解析
【科普】洗菜有技巧,不同蔬菜这样洗干净又放心!
子产品的分类有哪些?子产品的市场需求如何?
如何恢复眼睛视力
以中国优秀传统文化引领人工智能发展 增强中华文明全球影响力和传播力
冷风扇检测:确保安全与效能的关键环节
高尔夫球挥杆技术提升:十大实用训练方法
孩子命运由何决定?六大因素影响孩子成长
我的世界盾牌制作与使用指南
红曲米的制作方法步骤,制作红曲米的步骤详解
30页|新老人、新需求、新生态-2024年银发健康经济趋势与展望报告
高考志愿怎么填?热门还是爱好?专业人士给出解答→
关于鼻咽癌的那些事儿