![]() |
Home | Libraries | People | FAQ | More |
#define FP_ZERO /* 依據實現特定的值 */ #define FP_NORMAL /* 依據實現特定的值 */ #define FP_INFINITE /* 依據實現特定的值 */ #define FP_NAN /* 依據實現特定的值 */ #define FP_SUBNORMAL /* 依據實現特定的值 */ template <class T> int fpclassify(T t); template <class T> bool isfinite(T z); // 既不是無限數又不是NaN(Not a Number : 不是一個數字). template <class T> bool isinf(T t); // 無限數 (+ 或 -). template <class T> bool isnan(T t); // NaN. template <class T> bool isnormal(T t); // 有限的並且是規格化的. 包含頭文件 #include <boost\math\special_functions\fpclassify.hpp>
來使用這些函數
這些函數與C99中的同名宏提供相同的功能,實際上,如果C99中的宏是可用的,那麼這些函數就使用這些宏來實現。 否則的話這些函數依賴於 std::numeric_limits<>。
注意:在那些已經以宏的形式提供這些函數的平台上,這些函數的定義並沒有覆蓋(suppress:抑制)由頭文件math.h以宏的形式定義的這些名字。這意味著下面的代碼具有不同的含義:
using namespace boost::math; //如果定義了的話,那麼下面的代碼可能會調用一個全局宏 //但是如果類型Z沒有得到標準庫中的的支持,那麼下面的代碼可能無法編譯 isnan(z); // // 下面的代碼調用Boost版本的isnan // (通過"using namespace boost::math"來找到) // 對於任何具有numeric_limits支持的任何類型Z,Boost版本的isnan都可以正常工作: (isnan)(z); // // 和上面一樣,但是使用了名字空間限定. (boost::math::isnan)(z); // // 如果isnan是一個本地宏,那麼下面的代碼將會導致一個編譯錯誤: boost::math::isnan(z); //所以請一直使用下面的形式: (boost::math::isnan)(z); // // 你也可以使用一個.cpp文件中使用一個全局的using聲明, // 也可以在一個.hpp文件中的函數中使用一個局部的using聲明. using boost::math::isnan; // 那麼你的代碼可以寫得理簡短也更整潔一些 (isnan)(z) // 但是與上面一樣,如果 isnan 是一個本地宏,那麼上面的代碼會產生一個編譯錯誤 // 因為宏永遠最先獲得這個名字, 除非包含在一對()裡面。
這些函數的詳細描述如下:
template <class T> int fpclassify(T t);
返回一個將t的值分類的整數:
|
fp 的分類值 |
t的類別. |
|---|---|
|
FP_ZERO |
如果 t 的值為0. |
|
FP_NORMAL |
如果 t 是非零的, 並且是規範化的有限值 |
|
FP_INFINITE |
如果 t 是正無窮或是負無窮 |
|
FP_NAN |
如果 t 是一個 NaN(Not a Number) |
|
FP_SUBNORMAL |
如果 t 是一個非規範化的數字 |
template <class T> bool isfinite(T z);
僅當z 的值不是無窮的且不是NaN是才返回true.
template <class T> bool isinf(T t);
僅當z 的值是下無窮或是負無窮時才返回true.
template <class T> bool isnan(T t);
僅當 z 的值是NaN 才返回true.
template <class T> bool isnormal(T t);
僅當z 是一個常規的數字 (非零, 非無限, 非NaN, 或是規範化的)時才返回true.