揭秘 C++ 中的 NaN:產(chǎn)生原因、特性詳解及處理方法
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
本文作者希望通過(guò)這篇文章,讓開發(fā)者深入了解 C++ 中的 NaN 值及其有效處理方式。 原文鏈接:https://alexsyniakov.com/2024/03/20/understanding-nan-numbers-in-c-and-their-properties/ 作者 | Alex Syniakov 翻譯 | 鄭麗媛 NaN,即“Not a Number”,表示在實(shí)數(shù)范圍內(nèi)無(wú)法表達(dá)的數(shù)值。它的特殊性質(zhì),使得在編程(尤其是在 C++ 中)中處理 NaN 值成為許多開發(fā)人員感興趣的話題。為此,本文將深入探討什么是 NaN 值、它們是如何產(chǎn)生的、它們的特性以及如何在 C++ 中有效地處理它們。 一、NaN 是如何產(chǎn)生的?NaN 值可能由不產(chǎn)生確定或?qū)崝?shù)結(jié)果的操作而產(chǎn)生,常見(jiàn)例子包括: 零除以零; 無(wú)窮大除以無(wú)窮大; 零乘以無(wú)窮大; 帶相反符號(hào)的無(wú)窮級(jí)數(shù)相加; 計(jì)算負(fù)數(shù)的平方根; 取負(fù)數(shù)的對(duì)數(shù); 使用非數(shù)字操作數(shù)進(jìn)行復(fù)雜的數(shù)學(xué)運(yùn)算。 此外,在 C++ 中,還可以使用 std::nan(const char*) 或 std::numeric_limits<double>::quiet_NaN() 來(lái)明確地創(chuàng)建 NaN 值。 二、NaN 的特性NaN 的一個(gè)顯著特點(diǎn)是在比較時(shí)的行為。在全等運(yùn)算中,NaN 與其他任何值相比,結(jié)果都是 false。示例如下:
要確定一個(gè)值是否為 NaN,可將該值與自身進(jìn)行比較:
此外,在 C++ 中,有一個(gè)內(nèi)置函數(shù) std::is_nan(從 C++11 開始)也可以讓你檢查一個(gè)數(shù)字是否為 NaN。 三、NaN 對(duì)數(shù)據(jù)結(jié)構(gòu)的影響因此,如果您在計(jì)算中得到了 NaN 作為結(jié)果,然后將此值用于關(guān)聯(lián)容器中,例如:
此后,由于 NaN 不滿足關(guān)聯(lián)容器鍵的嚴(yán)格弱排序要求,無(wú)法向集合中插入任何值。 四、NaN 的標(biāo)準(zhǔn)和類型IEEE 754 標(biāo)準(zhǔn)將 NaN 值分為“quiet NaNs”(qNaNs)和“signaling NaNs”(sNaNs)。Quiet NaNs 允許計(jì)算繼續(xù)進(jìn)行而不受干擾,在算術(shù)運(yùn)算中悄無(wú)聲息地傳播。而 Signaling NaNs 則會(huì)觸發(fā)異常,立即處理無(wú)效操作。盡管這兩種 NaN 類型的區(qū)別很重要,但在 C++ 或 IEEE 754 標(biāo)準(zhǔn)庫(kù)接口中并沒(méi)有明確處理,更多地取決于底層硬件和編譯器行為。 五、檢查 NaN各種數(shù)學(xué)庫(kù)都提供了 NaN 檢查函數(shù),例如,glm 有一個(gè)函數(shù),用于檢查向量的各個(gè)分量是否為 NaN,并返回一個(gè)布爾向量: glm::dvec3 NaNvector = someFunction(); bool isNaN = glm::all(glm::isnan(NaNvector)); 一個(gè)更好的做法是,不僅檢查一個(gè)數(shù)字是否為 NaN,還應(yīng)該進(jìn)行更全面的檢查——判斷數(shù)字是否有限。為此,std 提供了函數(shù) std::isfinite(從 C++11 開始),在 glm 中也有類似的向量函數(shù)。
六、結(jié)論在 C++ 中處理 NaN 值需要了解它們的生成、屬性以及對(duì)數(shù)據(jù)結(jié)構(gòu)的影響。通過(guò)利用內(nèi)置函數(shù)并遵循最佳實(shí)踐,開發(fā)人員可以有效管理 NaN 值,確保他們的軟件可以優(yōu)雅地處理邊緣情況,并在整個(gè)計(jì)算過(guò)程中保持?jǐn)?shù)值的完整性。 ———————————————— 版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。 原文鏈接:https://blog.csdn.net/csdnnews/article/details/137580018 該文章在 2024/4/13 10:29:49 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |