网易首页 > 网易号 > 正文 申请入驻

揭秘 C++ 中的 NaN:产生原因、特性详解及处理方法

0
分享至


本文作者希望通过这篇文章,让开发者深入了解 C++ 中的 NaN 值及其有效处理方式。

原文链接:https://alexsyniakov.com/2024/03/20/understanding-nan-numbers-in-c-and-their-properties/

作 者 | Alex Syniakov

翻译 | 郑丽媛

NaN,即“Not a Number”,表示在实数范围内无法表达的数值。它的特殊性质,使得在编程(尤其是在 C++ 中)中处理 NaN 值成为许多开发人员感兴趣的话题。为此,本文将深入探讨什么是 NaN 值、它们是如何产生的、它们的特性以及如何在 C++ 中有效地处理它们。

一、NaN 是如何产生的?

NaN 值可能由不产生确定或实数结果的操作而产生,常见例子包括:

  • 零除以零;

  • 无穷大除以无穷大;

  • 零乘以无穷大;

  • 带相反符号的无穷级数相加;

  • 计算负数的平方根;

  • 取负数的对数;

  • 使用非数字操作数进行复杂的数学运算。

此外,在 C++ 中,还可以使用 std::nan(const char*) 或 std::numeric_limits ::quiet_NaN() 来明确地创建 NaN 值。

二、NaN 的特性

NaN 的一个显著特点是在比较时的行为。在全等运算中,NaN 与其他任何值相比,结果都是 false。示例如下:


double nanValue = 0.0 / 0.0;bool alwaysFalse = nanValue == nanValue; // falsebool alwaysTrue = nanValue != nanValue; // true

要确定一个值是否为 NaN,可将该值与自身进行比较:


bool isNan = nanValue != nanValue;

此外,在 C++ 中,有一个内置函数 std::is_nan(从 C++11 开始)也可以让你检查一个数字是否为 NaN。

三、NaN 对数据结构的影响

因此,如果您在计算中得到了 NaN 作为结果,然后将此值用于关联容器中,例如:


std::set test;test.insert(NaNvalue);test.insert(1.0); // 不会插入 test.insert(2.0); // 不会插入

此后,由于 NaN 不满足关联容器键的严格弱排序要求,无法向集合中插入任何值。

四、NaN 的标准和类型

IEEE 754 标准将 NaN 值分为“quiet NaNs”(qNaNs)和“signaling NaNs”(sNaNs)。Quiet NaNs 允许计算继续进行而不受干扰,在算术运算中悄无声息地传播。而 Signaling NaNs 则会触发异常,立即处理无效操作。尽管这两种 NaN 类型的区别很重要,但在 C++ 或 IEEE 754 标准库接口中并没有明确处理,更多地取决于底层硬件和编译器行为。

五、检查 NaN

各种数学库都提供了 NaN 检查函数,例如,glm 有一个函数,用于检查向量的各个分量是否为 NaN,并返回一个布尔向量:


glm::dvec3 NaNvector = someFunction();bool isNaN = glm::all(glm::isnan(NaNvector));

一个更好的做法是,不仅检查一个数字是否为 NaN,还应该进行更全面的检查——判断数字是否有限。为此,std 提供了函数 std::isfinite(从 C++11 开始),在 glm 中也有类似的向量函数。


std::println("{}", std::isfinite(std::numeric_limits::quiet_NaN()));
std::println("{}", std::isfinite(std::numeric_limits::infinity()));
std::println("{}", std::isfinite(-std::numeric_limits::infinity()));
std::println("{}", std::isfinite(0.0));
std::println("{}", std::isfinite(std::exp(1000)));
std::println("{}", std::isfinite(std::numeric_limits::min()));

六、结论

在 C++ 中处理 NaN 值需要了解它们的生成、属性以及对数据结构的影响。通过利用内置函数并遵循最佳实践,开发人员可以有效管理 NaN 值,确保他们的软件可以优雅地处理边缘情况,并在整个计算过程中保持数值的完整性。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
2比0!商竣程力救12破发点,爆冷英国名将挺进4强,锁定温网正赛

2比0!商竣程力救12破发点,爆冷英国名将挺进4强,锁定温网正赛

曹老师评球
2024-05-17 21:08:43
刘汉承包绵阳机场,地头蛇王永成从中作梗,第二天就被灭门

刘汉承包绵阳机场,地头蛇王永成从中作梗,第二天就被灭门

纸鸢奇谭
2024-05-15 12:21:33
“低空经济” 第一妖王大爆发,严重低估+主力抢筹超百亿,有望4倍飙升

“低空经济” 第一妖王大爆发,严重低估+主力抢筹超百亿,有望4倍飙升

蓝色海边
2024-05-17 18:28:48
图赫尔:这是我在拜仁的最后一次发布会;我不会再怨恨赫内斯

图赫尔:这是我在拜仁的最后一次发布会;我不会再怨恨赫内斯

懂球帝
2024-05-17 18:15:13
演员丫蛋说出心里话:嫁给句号老师,是令我不会后悔的决定

演员丫蛋说出心里话:嫁给句号老师,是令我不会后悔的决定

阿芒娱乐说
2024-05-17 23:48:32
一天内,美宣布两大决定,中方不再忍耐,减持美债购入大量黄金

一天内,美宣布两大决定,中方不再忍耐,减持美债购入大量黄金

特特农村生活
2024-05-17 19:40:28
网易号平台每日辟谣公告(五月十七日第二则)

网易号平台每日辟谣公告(五月十七日第二则)

网易号官方平台
2024-05-17 18:15:55
南京扶老人被讹后续!监控还原真相,家属登门道歉,对方大度原谅

南京扶老人被讹后续!监控还原真相,家属登门道歉,对方大度原谅

飘飘视角
2024-05-17 14:34:27
到今年网贷逾期3年了,催收短信变成这样子了!

到今年网贷逾期3年了,催收短信变成这样子了!

杨胜诉
2024-05-15 14:10:47
中通宁愿掉份额也不打价格战

中通宁愿掉份额也不打价格战

晚点LatePost
2024-05-17 13:17:48
大暴雨锁定广东广西,更凶龙舟水准备登场!预报:深红多雨区出现

大暴雨锁定广东广西,更凶龙舟水准备登场!预报:深红多雨区出现

中国气象爱好者
2024-05-16 21:25:02
伊能静庾澄庆没合体,庾澄庆站场外,将场内名额给伊能静陪儿子!

伊能静庾澄庆没合体,庾澄庆站场外,将场内名额给伊能静陪儿子!

小咪侃娱圈
2024-05-17 14:13:15
北约军援快速到位助乌击退大规模袭击,乌巡航导弹击毙俄高级军官

北约军援快速到位助乌击退大规模袭击,乌巡航导弹击毙俄高级军官

今观天下
2024-05-15 09:46:51
普京为出访安全做足准备,中国让他安心,但他还留了另一个护身符

普京为出访安全做足准备,中国让他安心,但他还留了另一个护身符

说天说地说实事
2024-05-17 10:03:27
国运来了挡都挡不住?俄乌战争最起码给中国又争取了五年时间

国运来了挡都挡不住?俄乌战争最起码给中国又争取了五年时间

曾经年少
2024-03-05 11:38:53
范大将军首度执掌教鞭!官方:40岁范佩西出任荷甲海伦芬主帅

范大将军首度执掌教鞭!官方:40岁范佩西出任荷甲海伦芬主帅

直播吧
2024-05-17 17:00:25
歌手2024:海来阿木逆袭,杨丞琳气息太飘,汪苏泷真该向他们学学

歌手2024:海来阿木逆袭,杨丞琳气息太飘,汪苏泷真该向他们学学

阿芒娱乐说
2024-05-17 22:09:22
并非马琳,为何逆转王曼昱拿奥运女单?谁注意陈梦手指变化

并非马琳,为何逆转王曼昱拿奥运女单?谁注意陈梦手指变化

东球弟
2024-05-16 13:49:32
北京散打冠军徐永亮被执行死刑,临刑前哭着抽完2根烟

北京散打冠军徐永亮被执行死刑,临刑前哭着抽完2根烟

安妮Emotiong
2024-05-16 18:02:12
《庆余年2》:太意外!太子也是穿越者,“羊驼”二皇子被当猴耍

《庆余年2》:太意外!太子也是穿越者,“羊驼”二皇子被当猴耍

子芫伴你成长
2024-05-17 18:14:03
2024-05-18 02:54:44
CSDN
CSDN
成就一亿技术人
24658文章数 241805关注度
往期回顾 全部

科技要闻

京东拼增长,大力出奇迹

头条要闻

媒体:菲律宾在南海闹事时 美国航母紧急"撤"到新加坡

头条要闻

媒体:菲律宾在南海闹事时 美国航母紧急"撤"到新加坡

体育要闻

中超疯狂星期五!5场28球,单场5球起步

娱乐要闻

《庆余年2》首播口碑出炉!有好有坏

财经要闻

重磅!楼市王炸来了 多部门出手救楼市

汽车要闻

内饰与配置全新升级 全新途观L PRO将于5月30日上市

态度原创

手机
艺术
数码
游戏
教育

手机要闻

统治手机市场十余年的曲面屏,终于要被消灭了?

艺术要闻

真诚度101%,35岁的诚品画廊为什么选择北京?

数码要闻

驰为 CoreBox 迷你主机发布:i5-13500H、2.5G 网口,1999 元起

物华弥新:毛公鼎抽取价值分析!这个结论应该还算合理吧!

教育要闻

英国毕业生工签审查结果出炉:建议继续保留!附PSW签证申请指南

无障碍浏览 进入关怀版