Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

雙階乘

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

namespace boost{ namespace math{

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

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

}} // namespaces

返回i!!.

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

如果計算結果太大以至於T類型無法表示,那麼就可能返回溢出錯誤 . 這裡的實現針對於i值較小時進行了優化,當i的值較小時,如果可能就從查找表中查找階乘的值。

精確性

這裡的實現使用了一個平凡的階乘函數的改寫, 所以誤差率不會超過幾個 10的-5次方(epsilon).

測試

雙階乘的抽樣測試數據由 functions.wolfram.com生成。

實現

雙階乘使用基於下面關係的階乘和γ函數來實現:

(2n)!! = 2n * n!

(2n+1)!! = (2n+1)! / (2n n!)

(2n-1)!! = Γ((2n+1)/2) * 2n / sqrt(pi)


PrevUpHomeNext