Arctan的快速近似算法

博客:博客园 | CSDN | blog

写在前面

如果arctan的计算成为了瓶颈,那么是时候对其进行优化了。

Arctangent.png

arctan的近似计算本质上是在所需精度范围内对arctan曲线进行拟合,比较直接的想法是泰勒展开

arctan(x)=xx33+x55x77+

根据需要的精度,确定展开多少项,但arctan的泰勒展开在x接近1时,收敛较慢,并不高效。

另一个直接的想法是查表,根据所需精度,正切值定点化后,将其对应的角度保存成表,计算时,根据最近的正切值查表,一般需要较大的内存空间。

需要注意的是,arctan(x)返回的是(π/2,π/2)arctan2(y,x)返回的范围是(π,π],因为后者可以根据xy的正负确定位于哪个象限。实际上,只需近似或存储[0,π/4]即可(即八象限中的第一象限),若输入向量(x,y),根据xy的正负和大小关系,可以折算到所有的八个象限。

此外,CORDIC(COordinate Rotation DIgital Computer)算法也是个选择,仅涉及移位和加法操作,但仍需要迭代。

Arctan快速近似计算

这里,罗列paper 《Efficient Approximations for the Arctangent Function 》中的7种近似算法,这些近似算法通过Lagrange interpolation和minimax optimization techniques得到,最大近似误差和所需计算如下所示,

error-and-computational-workload.png

从上到下依次为,

  • 线性近似,最大近似误差 0.07 rad=4

arctan(x)π4x,1x1

  • 二阶近似,最大近似误差 0.0053 rad=0.3

arctan(x)π4x+0.285x(1|x|),1x1

  • 搜索更佳的系数,最大近似误差 0.0038 rad=0.22

arctan(x)π4x+0.273x(1|x|),1x1

  • αx3+βx形式的三阶近似,最大近似误差 0.005 rad=0.29

arctan(x)π4x+x(0.1869820.191942x2),1x1

  • x(x1)(αxβ)形式的三阶近似,最大近似误差 0.0015 rad=0.086

arctan(x)π4xx(|x|1)(0.2447+0.0663|x|),1x1

  • x/(1+βx2)形式的近似,最大近似误差 0.0047 rad=0.27

arctan(x)x1+0.28086x2,1x1

  • 另一个近似,最大近似误差 0.0049 rad=0.28

arctan(x)x1+0.28125x2,1x1

实际使用时,可先定点化,按需选取。

以上。

参考

posted @   shine-lee  阅读(11996)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
51La
点击右上角即可分享
微信分享提示