![]() |
Home | Libraries | People | FAQ | More |
#include <boost/math/special_functions/zeta.hpp>
namespace boost{ namespace math{ template <class T> calculated-result-type zeta(T z); template <class T, class Policy> calculated-result-type zeta(T z, const Policy&); }} // namespaces
函數返回值的類型使用返回值推導法則:來確定,當x是整型的時候,返回值的類型是double,否則返回值是類型是T.
最後一個策略 參數是可選的並且可以用來控制函數的行為: 如何處理錯誤, 使用哪種層次的精度等等. 參見策略文檔瞭解更多信息。
template <class T> calculated-result-type zeta(T z); template <class T, class Policy> calculated-result-type zeta(T z, const Policy&);
返回z的 ζ 函數:
下面的表顯示了輸入參數的不同定義域的峰值誤差, 以及與GSL-1.9 庫和Cephes 庫的比較. 注意,在那些由寬浮點類型來給定窄浮點類型的系統上會有有效的零誤差.
表4.函數 zeta(z) 的誤差
|
有效數字位數 |
平台和編譯器 |
z > 0 |
z < 0 |
|---|---|---|---|
|
53 |
Win32, Visual C++ 8 |
峰值=0.99 均值=0.1 GSL 峰值=8.7 均值=1.0 Cephes 峰值=2.1 均值=1.1 |
峰值=7.1 均值=3.0 GSL 峰值=137 均值=14 Cephes 峰值=5084 均值=470 |
|
64 |
RedHat Linux IA_EM64, gcc-4.1 |
峰值=0.99 均值=0.5 |
峰值=570 均值=60 |
|
64 |
Redhat Linux IA64, gcc-4.1 |
峰值=0.99 均值=0.5 |
峰值=559 均值=56 |
|
113 |
HPUX IA64, aCC A.06.06 |
峰值=1.0 均值=0.4 |
峰值=1018 均值=79 |
這引起函數的測試包含兩部分: 基本的合理性測試使用Mathworld's 在線求值產生的抽樣數據,而精度測試的數據使用精度為1000-bits的NTL::RR 庫以及這個庫生成. 注意:這些函數的一般版本和類型特定的版本在內部使用不同的實現,所以這就可以給我們生成相互獨立的測試數據。使用我們的測試數據來測試其它的"已知的良好 (known good)" 庫同樣也提供了一個合理性測試.
所有的這些實現都首先使用通常的反射方程來使得它們的參數為正數。
這些函數的一般版本使用下面的級數:
對於較大的z使用全局的收斂級數 :
在所有其它的情況中. 選擇這些情況的交叉點,使得僅當它會快速合理收斂的時候才使用第一個級數,這個級數的問題在於你所使用的項越多,級數的收斂就越慢。所以,在使用這個級數之前我們要確保收斂,即使另外一種實現方法會更慢一些 。
當小數 (尾數) 大小是已知的時候(當前針對於 53, 64 和 113-bit 實數, 向上提升為double的單精度的24-bits實數 ) 使用級數的有理逼近,由JM發明 .
對於 0 < z < 1 逼近形式是:
對於一個有理逼近 R(1-z) 和 一個常量C.
對於 1 < z < 4 逼近形式是:
對於一個有理逼近 R(n-z) 和 一個常量 C 以及整數 n.
對於 z > 4 逼近形式是::
ζ(z) = 1 + eR(z - n)
對於一個有理逼近R(z-n) 和一個整數 n, 注意: R(z-n)所要求的精度並不是完全的機器精度(machine precision) , 絕對誤差為: ε/R(0). 當計算的z值很大是,尤其是當ε 很小的時候這為我們節省了一些bit 。