高精度反三角函数计算

 1 背景
有时需要进行高精度的反三角函数计算,本文就导出反三角函数的计算方式。

 

2 反正切函数计算
由于反正弦、反余弦、反余切函数均可以利用反正切函数进行计算,因此这里主要给出反正切的计算方式。

2.1 函数展开
对于反正切函数,存在如下展开形式
(1)
$$
\arctan(z)=z-\dfrac{z^3}{3+\dfrac{9z^2}{5+\dfrac{4z^2}{7+\dfrac{25z^2}{9+\dfrac{16z^2}{11+\dfrac{49z^2}{…}}}}}}
$$
很明显,上面z趋近0时,收敛速度才快一些。公式里\(9、4、25、16、49\)对应表达式为 \((i+1-(-1)^i)^2\)时 \(i=1、2、3、4、5、…\)

2.2 性质
当 \(xy \geq 0\)时有如下表达式  
(2)
$$
\arctan(x)=\arctan(\dfrac{x-y}{1+xy})+\arctan(y)
$$
明显,如果 \(\arctan(y)\)的值被提前计算出来,则这时计算 \(\arctan(x)\)变成计算 \(\arctan(\dfrac{x-y}{1+xy})\).

另一方面 \(\arctan(-x)=-\arctan(x)\),因此在实际处理时,仅考虑 \(x> 0\)的情况。而我们知道\(\tan\)函数在正向取值时,可以仅考虑\([0,\dfrac{\pi}{2})\)区间,而\(\tan(\pi/4)=1\),因此当\(x \geq 1\)时,使用如下公式进行转换  
(3)
$$
\arctan(x)=\dfrac{\pi}{4}+\arctan(\dfrac{x-1}{x+1})
$$
可以发现公式(3)在\(x\)趋近1时,求解的值才变得小一点,根据公式(2),当\(y\)趋近无穷大时,可以得到如下结果  
(4)
$$
\arctan(x)=\dfrac{\pi}{2}-\arctan(\dfrac{1}{x})
$$
结合(3)(4)令  
(5)
$$
\dfrac{x-1}{x+1}=\dfrac{1}{x}
$$
可以得到 \(x=1+\sqrt{2}\),这时\(\dfrac{1}{x}\approx 0.41421356237309 < 0.415\)。因此对于\(\arctan(x)\),当\(x\geq 0\)时,总能通过(3)或者(4)将其值区间变到\([0,0.415)\)范围内。

另一方面,令   
(6)
$$
\dfrac{x-1}{x+1}=-\dfrac{1}{1+\sqrt{2}}
$$
求解方程(6)可以得到\(x=\dfrac{1}{1+\sqrt{2}}\approx 0.41421356237309\),由于函数\(\dfrac{x-1}{x+1}\)在\([0,1]\)区间单调递增,因此对于\(\arctan(x)\),当 \(x>\dfrac{1}{1+\sqrt{2}}\)且\(x \leq 1+\sqrt{2}\) 时,可以先使用公式(3)进行变换,最终求值区间均在\([0,\dfrac{1}{1+\sqrt{2}}]\)范围内。

因此从(3)到(6)有如下结论:  
(7)
$$
\arctan({x})=\begin{cases}
\dfrac{\pi}{2}-\arctan(\dfrac{1}{x}) &, x \geq 1+ \sqrt{2}
\\
\\
\dfrac{\pi}{4}+\arctan(\dfrac{x-1}{x+1}) &, \dfrac{1}{1+\sqrt{2}} < x < 1+\sqrt{2}
\\
\\
\arctan(x) &, 0 \leq x \leq \dfrac{1}{1+\sqrt{2}}
\\
\\
-\arctan(-x) &, x < 0
\end{cases}
$$

上面公式虽然可以把反正切函数参数区间限制在\([0,0.415)\)范围内,但区间间范围依然不够小,在这个区间范围内,反正切函数有如下性质  
(8)
$$
\arctan(x)=\dfrac{1}{2}\arctan(\dfrac{2x}{1-x^2})
$$
当\(0 \leq x < 1\)`时 \(\dfrac{2x}{1-x^2}> x\),明显,上式不是预期的效果,这里需要将参数变小而不是变大,因此这时对(8)进行变形有  
(9)
$$
\arctan(x)=2\arctan(\dfrac{\sqrt{1+x^2}-1}{x})
$$
这里设  
(10)
$$
\dfrac{\sqrt{1+x^2}-1}{x}=ax  \Rightarrow a=\dfrac{\sqrt{1+x^2}-1}{x^2}
$$
由于 \(f(x)= \dfrac{\sqrt{1+x^2}-1}{x^2}\)在区间\((0,\dfrac{1}{1+\sqrt{2}})\)单调递减,因此有  
(11)
$$
\begin{cases}
a<\lim_{x \rightarrow 0} \dfrac{\sqrt{1+x^2}-1}{x^2}=\dfrac{1}{2}
\\
\\
a >\lim_{x \rightarrow \dfrac{1}{1+\sqrt{2}}} \dfrac{\sqrt{1+x^2}-1}{x^2}=\sqrt{20+14\sqrt{2}}-(3+2\sqrt{2})\approx 0.48021693505171 > 0.48
\end{cases}
$$
因此,从(11)可以看出,每执行一次(9)的变换,参数变小大概在\(\dfrac{1}{2}\)倍。

使用(9)时,存在开方的成本,如果想尽量减少变换次数(也即减少开方次数),可以利用(2)式再预制几个系数。
(12)
$$
\begin{cases}
\arctan(x)= \arctan(\dfrac{1}{8})+\arctan(\dfrac{8x-1}{x+8})
\\
\\
\arctan(x)= \arctan(\dfrac{5}{16})+\arctan(\dfrac{16x-5}{16+5x})
\end{cases}
$$
最终结合(7)、(9)、(12)可以得到如下算法  
(13)
$$
\arctan({x})=\begin{cases}
-\arctan(-x) &, x < 0
\\
\\
\arctan(x) &, 0 \leq x \leq \delta,这里直接进行计算
\\
\\
2\arctan(\dfrac{\sqrt{1+x^2}-1}{x}) &,\delta < x \leq \sqrt{65}-8
\\
\\
\arctan(\dfrac{1}{8})+\arctan(\dfrac{8x-1}{x+8}) &,\sqrt{65}-8 < x \leq \dfrac{\sqrt{18265}-123}{56}
\\
\\
\arctan(\dfrac{5}{16})+\arctan(\dfrac{16x-5}{16+5x})&, \dfrac{\sqrt{18265}-123}{56} < x \leq \dfrac{1}{1+\sqrt{2}}
\\
\\
\dfrac{\pi}{4}+\arctan(\dfrac{x-1}{x+1}) &, \dfrac{1}{1+\sqrt{2}} < x \leq 1+\sqrt{2}
\\
\\
\dfrac{\pi}{2}-\arctan(\dfrac{1}{x}) &, x > 1+ \sqrt{2}
\end{cases}
$$
公式里\(\delta\)为一个小量。在实际使用中可设置为0.01。这个参数对计算精度贡献较小。

 

2.3 截断

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

(14)$$
m = \lceil -1.49834822214794+1.30624309011713p \rceil
$$

2.4 算法
最终使用如下算法计算 \(\arctan(x)\):
① 设小量\(\delta=0.01\)。

② 根据公式(13)将参数变到\((0,\delta]\)范围内。设变换后的参数为\(z\)。

③ 根据有效位\(p\),依据公式(14)计算截断项数\(m\)。

④ 设 \(y_m = 2m+1\)。

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

⑥ 返回 \(\arctan(z)=z – \dfrac{z^3}{y_1}\)。

 

3 其它反函数计算
3.1 反余切计算  
(15)
$$
\mathbf{arccot}(x)=\arctan(\dfrac{1}{x})
$$

3.2 反正弦计算  
根据复数运算规则,可以推出如下表达式

(16)
$$
\arcsin(x)=\arctan(\dfrac{x}{\sqrt{1-x^2}})
$$

3.3 反余弦计算  
根据正余弦 \(\dfrac{\pi}{2}\)的关系,结合(15)可以得到  
(17)
$$
\arccos(x)=\dfrac{\pi}{2} -\arctan(\dfrac{x}{\sqrt{1-x^2}})
$$