高精度正余弦计算

1 背景

有时需要进行高精度的正余弦函数计算,这时就需要正余弦的计算方式。

2 正弦函数计算

2.1 函数展开
对于正弦函数,存在如下展开形式
(1)
$$
\sin(z)=\dfrac{z}{1+\dfrac{z^2}{6-z^2+\dfrac{6z^2}{20-z^2+\dfrac{20z^2}{42-z^2+\dfrac{42z^2}{72-z^2+\dfrac{72z^2}{110-z^2+\dfrac{110z^2}{156-z^2+…}}}}}}}
$$

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

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

这里约定\(n\)按如下形式取值

(4)$$
 \dfrac{|x|}{3^n}<\dfrac{1}{3^{31}}
$$

2.3 截断

 

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

(5)$$
m =\lfloor 1.02497850806725+0.02956390486989p  \rfloor
$$

2.4 算法
最终使用如下步骤计算\(\sin(x)\):

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

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

③ 设 \(y_m=1\)。

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

⑤ 设 \(r_0 = \dfrac{z}{1+\dfrac{z^2}{y_1}}\)。

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

⑦ 返回 \(\sin(x)=r_n\)。

 

3 余弦函数计算
第2部分给出了正弦函数计算方式,而余弦函数可以通过如下方式进行计算  
(4)
$$
\cos(x)=1-2\sin^2(\dfrac{x}{2})
$$