Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

浮點數分類: 無限數和非數字(Infinities and NaN's)

概要
#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.


PrevUpHomeNext