欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

揭秘 C++ 中的 NaN:產(chǎn)生原因、特性詳解及處理方法

freeflydom
2024年4月13日 10:25 本文熱度 763

本文作者希望通過這篇文章,讓開發(fā)者深入了解 C++ 中的 NaN 值及其有效處理方式。


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

作者 | Alex Syniakov

翻譯 | 鄭麗媛


NaN,即“Not a Number”,表示在實數(shù)范圍內(nèi)無法表達的數(shù)值。它的特殊性質(zhì),使得在編程(尤其是在 C++ 中)中處理 NaN 值成為許多開發(fā)人員感興趣的話題。為此,本文將深入探討什么是 NaN 值、它們是如何產(chǎn)生的、它們的特性以及如何在 C++ 中有效地處理它們。



一、NaN 是如何產(chǎn)生的?

NaN 值可能由不產(chǎn)生確定或?qū)崝?shù)結(jié)果的操作而產(chǎn)生,常見例子包括:

零除以零;

無窮大除以無窮大;

零乘以無窮大;

帶相反符號的無窮級數(shù)相加;

計算負(fù)數(shù)的平方根;

取負(fù)數(shù)的對數(shù);

使用非數(shù)字操作數(shù)進行復(fù)雜的數(shù)學(xué)運算。

此外,在 C++ 中,還可以使用 std::nan(const char*) 或 std::numeric_limits<double>::quiet_NaN() 來明確地創(chuàng)建 NaN 值。

二、NaN 的特性

NaN 的一個顯著特點是在比較時的行為。在全等運算中,NaN 與其他任何值相比,結(jié)果都是 false。示例如下:

double nanValue = 0.0 / 0.0;

bool alwaysFalse = nanValue == nanValue; // false

bool alwaysTrue = nanValue != nanValue; // true

要確定一個值是否為 NaN,可將該值與自身進行比較:

bool isNan = nanValue != nanValue;

此外,在 C++ 中,有一個內(nèi)置函數(shù) std::is_nan(從 C++11 開始)也可以讓你檢查一個數(shù)字是否為 NaN。

三、NaN 對數(shù)據(jù)結(jié)構(gòu)的影響

因此,如果您在計算中得到了 NaN 作為結(jié)果,然后將此值用于關(guān)聯(lián)容器中,例如:

std::set<double> test;

test.insert(NaNvalue);

test.insert(1.0); // 不會插入 test.insert(2.0); // 不會插入

此后,由于 NaN 不滿足關(guān)聯(lián)容器鍵的嚴(yán)格弱排序要求,無法向集合中插入任何值。

四、NaN 的標(biāo)準(zhǔn)和類型

IEEE 754 標(biāo)準(zhǔn)將 NaN 值分為“quiet NaNs”(qNaNs)和“signaling NaNs”(sNaNs)。Quiet NaNs 允許計算繼續(xù)進行而不受干擾,在算術(shù)運算中悄無聲息地傳播。而 Signaling NaNs 則會觸發(fā)異常,立即處理無效操作。盡管這兩種 NaN 類型的區(qū)別很重要,但在 C++ 或 IEEE 754 標(biāo)準(zhǔn)庫接口中并沒有明確處理,更多地取決于底層硬件和編譯器行為。

五、檢查 NaN

各種數(shù)學(xué)庫都提供了 NaN 檢查函數(shù),例如,glm 有一個函數(shù),用于檢查向量的各個分量是否為 NaN,并返回一個布爾向量:

glm::dvec3 NaNvector = someFunction();

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

一個更好的做法是,不僅檢查一個數(shù)字是否為 NaN,還應(yīng)該進行更全面的檢查——判斷數(shù)字是否有限。為此,std 提供了函數(shù) std::isfinite(從 C++11 開始),在 glm 中也有類似的向量函數(shù)。

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()));

六、結(jié)論

在 C++ 中處理 NaN 值需要了解它們的生成、屬性以及對數(shù)據(jù)結(jié)構(gòu)的影響。通過利用內(nèi)置函數(shù)并遵循最佳實踐,開發(fā)人員可以有效管理 NaN 值,確保他們的軟件可以優(yōu)雅地處理邊緣情況,并在整個計算過程中保持?jǐn)?shù)值的完整性。


————————————————

 版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。

原文鏈接:https://blog.csdn.net/csdnnews/article/details/137580018



該文章在 2024/4/13 10:29:49 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved