博客:博客园 | CSDN | blog
写在前面
如果a r c t a n a r c t a n 的计算成为了瓶颈,那么是时候对其进行优化了。
a r c t a n a r c t a n 的近似计算本质上是在所需精度范围内对a r c t a n a r c t a n 曲线进行拟合,比较直接的想法是泰勒展开 ,
arctan ( x ) = x − x 3 3 + x 5 5 − x 7 7 + … arctan ( x ) = x − x 3 3 + x 5 5 − x 7 7 + …
根据需要的精度,确定展开多少项,但a r c t a n a r c t a n 的泰勒展开在x x 接近1时,收敛较慢,并不高效。
另一个直接的想法是查表 ,根据所需精度,正切值定点化后,将其对应的角度保存成表,计算时,根据最近的正切值查表,一般需要较大的内存空间。
需要注意的是,a r c t a n ( x ) a r c t a n ( x ) 返回的是( − π / 2 , π / 2 ) ( − π / 2 , π / 2 ) , a r c t a n 2 ( y , x ) a r c t a n 2 ( y , x ) 返回的范围是( − π , π ] ( − π , π ] ,因为后者可以根据x x 和y y 的正负确定位于哪个象限。实际上,只需近似或存储[ 0 , π / 4 ] [ 0 , π / 4 ] 即可(即八象限中的第一象限),若输入向量( x , y ) ( x , y ) ,根据x x 和y y 的正负和大小关系,可以折算到所有的八个象限。
此外,CORDIC(CO ordinate R otation DI gital C omputer) 算法也是个选择,仅涉及移位和加法操作,但仍需要迭代。
Arctan快速近似计算
这里,罗列paper 《Efficient Approximations for the Arctangent Function 》中的7种近似算法,这些近似算法通过Lagrange interpolation 和minimax optimization techniques得到,最大近似误差和所需计算如下所示,
从上到下依次为,
线性近似 ,最大近似误差 0.07 r a d = 4 ∘ 0.07 r a d = 4 ∘ ,
arctan ( x ) ≈ π 4 x , − 1 ≤ x ≤ 1 arctan ( x ) ≈ π 4 x , − 1 ≤ x ≤ 1
二阶近似 ,最大近似误差 0.0053 r a d = 0.3 ∘ 0.0053 r a d = 0.3 ∘ ,
arctan ( x ) ≈ π 4 x + 0.285 x ( 1 − | x | ) , − 1 ≤ x ≤ 1 arctan ( x ) ≈ π 4 x + 0.285 x ( 1 − | x | ) , − 1 ≤ x ≤ 1
搜索更佳的系数,最大近似误差 0.0038 r a d = 0.22 ∘ 0.0038 r a d = 0.22 ∘ ,
arctan ( x ) ≈ π 4 x + 0.273 x ( 1 − | x | ) , − 1 ≤ x ≤ 1 arctan ( x ) ≈ π 4 x + 0.273 x ( 1 − | x | ) , − 1 ≤ x ≤ 1
α x 3 + β x α x 3 + β x 形式的三阶近似 ,最大近似误差 0.005 r a d = 0.29 ∘ 0.005 r a d = 0.29 ∘ ,
arctan ( x ) ≈ π 4 x + x ( 0.186982 − 0.191942 x 2 ) , − 1 ≤ x ≤ 1 arctan ( x ) ≈ π 4 x + x ( 0.186982 − 0.191942 x 2 ) , − 1 ≤ x ≤ 1
x ( x − 1 ) ( α x − β ) x ( x − 1 ) ( α x − β ) 形式的三阶近似 ,最大近似误差 0.0015 r a d = 0.086 ∘ 0.0015 r a d = 0.086 ∘ ,
arctan ( x ) ≈ π 4 x − x ( | x | − 1 ) ( 0.2447 + 0.0663 | x | ) , − 1 ≤ x ≤ 1 arctan ( x ) ≈ π 4 x − x ( | x | − 1 ) ( 0.2447 + 0.0663 | x | ) , − 1 ≤ x ≤ 1
x / ( 1 + β x 2 ) x / ( 1 + β x 2 ) 形式的近似,最大近似误差 0.0047 r a d = 0.27 ∘ 0.0047 r a d = 0.27 ∘ ,
arctan ( x ) ≈ x 1 + 0.28086 x 2 , − 1 ≤ x ≤ 1 arctan ( x ) ≈ x 1 + 0.28086 x 2 , − 1 ≤ x ≤ 1
另一个近似,最大近似误差 0.0049 r a d = 0.28 ∘ 0.0049 r a d = 0.28 ∘ ,
arctan ( x ) ≈ x 1 + 0.28125 x 2 , − 1 ≤ x ≤ 1 arctan ( x ) ≈ x 1 + 0.28125 x 2 , − 1 ≤ x ≤ 1
实际使用时,可先定点化,按需选取。
以上。
参考
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」