一、isnan函數介紹
在C++11中提供了isnan函數用於判斷浮點數是否為NaN(Not a Number)。
NaN在計算機領域一般用來表示無效的浮點數,例如對0進行除法操作、對負數進行取根操作、對負數進行對數操作等都會導致NaN的出現。
double d1 = 0 / 0.0; double d2 = sqrt(-1); double d3 = log(-1); std::cout << std::isnan(d1) << std::endl; // 1 std::cout << std::isnan(d2) << std::endl; // 1 std::cout << std::isnan(d3) << std::endl; // 1
二、isnan函數應用
isnan函數常見運用場景是作為數值是否非法的判斷。
double d = getValue(); if(std::isnan(d)) { std::cout << "value is not valid!" << std::endl; }
同時,C++11中還有isinf函數,用於判斷浮點數是否為正無窮或負無窮。
double d1 = sqrt(2); // 有限的數值 double d2 = log(0); // 負無窮 double d3 = exp(1000); // 正無窮 std::cout << std::isinf(d1) << std::endl; // 0 std::cout << std::isinf(d2) << std::endl; // -1 std::cout << std::isinf(d3) << std::endl; // 1
三、使用isnan函數需要注意的事項
isnan函數的參數類型必須是浮點數類型,否則會編譯報錯。
同時,需要注意IEEE 754標準中的NaN有兩種,quiet NaN和signaling NaN,其中quiet NaN用於非常量計算或者其他非錯誤信號標記,而signaling NaN用於比較或進行其他錯誤標記。
具體的,C++標準中規定了quiet NaN是SNaN的父類,但不是所有的NaN都是quiet NaN。
float f1 = std::numeric_limits::infinity(); float f2 = std::numeric_limits::quiet_NaN(); float f3 = std::numeric_limits::signaling_NaN(); std::cout << std::isnan(f1) << std::endl; // 0 std::cout << std::isnan(f2) << std::endl; // 1 std::cout << std::isnan(f3) << std::endl; // 1 std::cout << std::isnan(nan("0x7fffff")) << std::endl; // 1
四、總結
isnan函數在C++11中提供了一種簡單有效的方法判斷浮點數是否為NaN,同時也可以配合isinf函數使用判斷浮點數是否為無窮。
在使用isnan函數時需要注意參數類型必須是浮點類型,同時需要注意IEEE 754標準中的NaN的細節。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/190409.html