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) ...