Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

階乘

概要

#include <boost/math/special_functions/factorials.hpp>

namespace boost{ namespace math{

template <class T>
T factorial(unsigned i);

template <class T, class Policy>
T factorial(unsigned i, const Policy&);

template <class T>
T unchecked_factorial(unsigned i);

template <class T>
struct max_factorial;

}} // namespaces
說明
template <class T>
T factorial(unsigned i);

template <class T, class Policy>
T factorial(unsigned i, const Policy&);

返回i!.

最後一個策略 參數是可選的並且可以用來控制函數的行為: 如何處理錯誤, 使用哪種層次的精度等等. 參見策略文檔瞭解更多信息。

i <= max_factorial<T>::value時,階乘的值是通過表查找來計算的, 對於較大的i值, 階乘函數是以 tgamma函數的方式來實現的。

如果i的值太大以至於結果無法在T類型中進行表示, 那麼就調用 溢出錯誤.

template <class T>
T unchecked_factorial(unsigned i);

返回i!.

在這個函數內部是通過表查找來計算階乘結果. 更進一步,它並沒有對i的值進行範圍檢查:由用戶來確保i <= max_factorial<T>::value. 這個函數打算用在需要快速表查找的內部循環中, 但是要求注意確保i的值永遠都不會增長得太在。

template <class T>
struct max_factorial
{
   static const unsigned value = X;
};

特性類(traits class,也稱作萃取類) 定義了可以傳遞給unchecked_factorial的最大值。成員變量value 可以用在需要整型常量的地方: 用於定義依賴於這個階乘函數的查找表的大小.

精確性

對於小於max_factorial<T>::value 的變量,結果應當進行正確的捨入. 對於大的參數值,精度和tgamma一樣。

測試

基本的合理性檢查(sanity check)以及用於檢測階乘查找表正確性的抽樣數據: 對於tgamma 函數的主要測試已經處理了這些情況.

Implementation

對於較小的參數,階乘函數是以查找表的形式來實現的, 對於較大的參數是以tgamma 函數來實現的.


PrevUpHomeNext