發表文章

目前顯示的是 4月, 2022的文章

C++ nan和inf 的判斷和使用

 前言 在資料處理輸入輸出時,極有可能遇到資料讀入空值(極大、極小)、運算中分母為0或0.0,對0取對數等操作,這將產生nan或inf的產生。這篇博文旨在分析C/C++產生nan和inf的操作及判斷是否有nan或inf產生。 NAN的產生原因 nan: not a number,表示“無效數字”。 以下情況會出現nan: 對負數開方,如:−1.0−−−−√−1.0; 對負數求對數,如:log(−1.0)log⁡(−1.0); 0.00.00.00.0; 0.0*inf; infinfinfinf; inf-inf這些操作都會得到nan。 (0000會產生操作異常;0.00.00.00.0不會產生操作異常,而是會得到nan); 注意:nan是無序的(unordered),無法對其進行邏輯運算。它不大於、小於或等於任何數(包括它自己),將<,>,<=,和>=作用於nan產生一個exception。得到nan時就檢視是否有非法操作,如果表示式中含有nan,那麼表示式的結果為nan。 INF的產生原因 INF:infinite,表示“無窮大”。 超出浮點數的表示範圍(溢位,即階碼部分超過其能表示的最大值)。 以下情況會出現inf: 1.00.01.00.0 等於inf; −1.00.0−1.00.0 等於-inf; 0.0+inf=inf; log(0); 注意:+inf大於任何數(除了它自己和nan),-inf小於任何數(除了它自己和nan),得到inf時就檢視是否有溢位或者除以0。inf在C語言表示式中就表示數學裡無限的概念,如1.0/inf等於0.0,並可以與其他浮點數進行比較的(可以參與<=、>+、==、!=等運算)。 nan和inf的判斷 下面幾個巨集即包含在math.h標頭檔案,可用於判斷一個表示式的結果是否為inf、nan或其他。使用時包括include<math.h>include<math.h>。 int isfinite(x); int isnormal(x); int isnan(x); int isinf(x); 開啟math.h可以看到定義: #define isnormal(x) ...

在 C++ 中從指向向量的指標訪問成員函式

使用 -> 記法從指標訪問向量的成員函式 -> 運算子可以從指向向量的指標呼叫 vector 成員函式。在這種情況下,我們是把指向向量的指標傳遞給了一個不同的函式。作為成員函式,結構體/類的任何資料成員都需要使用 -> 符號來訪問。需要注意的是,將物件的指標傳遞給不同的函式時,應在變數前使用運算子的地址(&)。 void VectorElements ( vector < T > * vec ) { for ( auto i = 0 ; i < vec -> size ( ) ; ++ i ) { cout << vec -> at ( i ) << endl ; } } 使用 (*)vector.member 符號從指向向量的指標訪問成員函式 訪問指標所指向的值時,使用瞭解引用(dereference)操作,可以在功能上替代 -> 運算子,提高可讀性。(*vec).at(i) 表示式基本上也可以完成成員訪問的操作。注意,我們使用的是可以列印通用型別元素的向量的函式模板。 void VectorElements ( vector < T > * vec ) { for ( auto i = 0 ; i < ( * vec ) . size ( ) ; ++ i ) { cout << ( * vec ) . at ( i ) << endl ; } }