目錄
寫在前面
如果\(arctan\)的計算成為了瓶頸,那么是時候對其進行優化了。
\(arctan\)的近似計算本質上是在所需精度范圍內對\(arctan\)曲線進行擬合,比較直接的想法是泰勒展開,
\[\arctan (x)=x-\frac{x^{3}}{3}+\frac{x^{5}}{5}-\frac{x^{7}}{7}+\ldots \]
根據需要的精度,確定展開多少項,但\(arctan\)的泰勒展開在\(x\)接近1時,收斂較慢,並不高效。
另一個直接的想法是查表,根據所需精度,正切值定點化后,將其對應的角度保存成表,計算時,根據最近的正切值查表,一般需要較大的內存空間。
需要注意的是,\(arctan(x)\)返回的是\((-\pi/2, \pi/2)\), \(arctan2(y, x)\)返回的范圍是\((-\pi, \pi ]\),因為后者可以根據\(x\)和\(y\)的正負確定位於哪個象限。實際上,只需近似或存儲\([0, \pi/4]\)即可(即八象限中的第一象限),若輸入向量\((x, y)\),根據\(x\)和\(y\)的正負和大小關系,可以折算到所有的八個象限。
此外,CORDIC(COordinate Rotation DIgital Computer)算法也是個選擇,僅涉及移位和加法操作,但仍需要迭代。
Arctan快速近似計算
這里,羅列paper 《Efficient Approximations for the Arctangent Function 》中的7種近似算法,這些近似算法通過Lagrange interpolation和minimax optimization techniques得到,最大近似誤差和所需計算如下所示,
從上到下依次為,
- 線性近似,最大近似誤差 \(0.07 \ rad = 4^{\circ}\),
\[\arctan (x) \approx \frac{\pi}{4} x, \quad-1 \leq x \leq 1 \]
- 二階近似,最大近似誤差 \(0.0053 \ rad = 0.3^{\circ}\),
\[\arctan (x) \approx \frac{\pi}{4} x+0.285 x(1-|x|), \quad-1 \leq x \leq 1 \]
- 搜索更佳的系數,最大近似誤差 \(0.0038 \ rad = 0.22^{\circ}\),
\[\arctan (x) \approx \frac{\pi}{4} x+0.273 x(1-|x|), \quad-1 \leq x \leq 1 \]
- \(\alpha x^{3}+\beta x\)形式的三階近似,最大近似誤差 \(0.005 \ rad = 0.29^{\circ}\),
\[\arctan (x) \approx \frac{\pi}{4} x+x\left(0.186982-0.191942 x^{2}\right), \quad-1 \leq x \leq 1 \]
- \(x(x-1)(\alpha x-\beta)\)形式的三階近似,最大近似誤差 \(0.0015 \ rad = 0.086^{\circ}\),
\[\arctan (x) \approx \frac{\pi}{4} x-x(|x|-1)(0.2447+0.0663|x|), \quad-1 \leq x \leq 1 \]
- \(x /\left(1+\beta x^{2}\right)\)形式的近似,最大近似誤差 \(0.0047 \ rad = 0.27^{\circ}\),
\[\arctan (x) \approx \frac{x}{1+0.28086 x^{2}}, \quad-1 \leq x \leq 1 \]
- 另一個近似,最大近似誤差 \(0.0049 \ rad = 0.28^{\circ}\),
\[\arctan (x) \approx \frac{x}{1+0.28125 x^{2}}, \quad-1 \leq x \leq 1 \]
實際使用時,可先定點化,按需選取。
以上。