高精度正余切计算

1 背景

有时需要进行高精度的正余切函数计算,因此需要知道正余切的计算方式。

2 正切函数计算

由于余切函数可以通过正切函数计算,因此这里主要给出正切函数计算方式。

2.1  函数展开
对于正切函数,存在如下展开形式
(1)
$$
\tan(z)=\dfrac{z}{1-\dfrac{z^2}{3-\dfrac{3z^2}{15-\dfrac{15z^2}{35-\dfrac{35z^2}{63-\dfrac{63z^2}{99-\dfrac{99z^2}{…}}}}}}}
$$

很明显,上面\(z\)趋近0时,收敛速度才快一些。公式里\(3、15、35、63、99\)对应的表达式为 \((2i-1)(2i+1)\)时 \(i=1、2、3、4、5、…\)。

2.2 性质
对于正切函数,有如下性质  
(2)
$$
\tan(x)=\dfrac{2\tan(\dfrac{x}{2})}{1-\tan^2(\dfrac{x}{2})}
$$
由于\(\tan\)函数为\(\pi\)的周期函数,因此这里考虑\(x\)在\((-\pi/2,\pi/2)\)取值计算。则总存在如下一个整数\(n\),使得\(z\)值接近0  
(3)
$$
z = \dfrac{x}{2^n}
$$

这里约定\(n\)按如下方式取得

(4)
$$
\dfrac{|x|}{2^n}<\dfrac{1}{2^{40}}
$$

2.3 截断

在使用(1)式进行迭代时,需要进行项数\(m\)截断。对于10进制下有效位位数为\(p\)的情况下,使用如下经验公式计算\(m\)

(5)$$
m = \lceil 0.43116670516841+0.03508654522889p \rceil
$$

2.4 算法
这里使用如下步骤计算\(\tan(x)\):

① 根据(4)找到一个最小的\(n\)值使得\(|z|<\dfrac{1}{2^{40}}\)。

② 根据有效位\(p\),根据(5)计算截断项数\(m\)。

③ 设 \(y_m=(2m-1)(2m+1)\)。

④ 循环计算 \(y_i=(2i-1)(2i+1)(1-\dfrac{z^2}{y_{i+1}})\),这里 \(i=m-1,m-2,…,1\)。

⑤ 设 \(r_1 =\dfrac{z}{1-\dfrac{z^2}{y_1}} \)。

⑥ 循环计算 \(r_i = \dfrac{2r_{i-1}}{1-r_{i-1}^2}\),这里 \(i=1,2,3,…,n\)。

⑦ 最终 \(\tan(x)=r_n\)。