我的正弦近似算法是否在精度/性能上优于Remez算法?
紧凑型三角函数近似算法:超越Remez算法的精度与性能表现
这是目前最紧凑的正弦近似算法,在精度与性能表现上,它能够胜过Remez算法。以下是针对[0, π/2]区间的近似实现:
double p[] = { -0.0020836519336891552, -0.016434778826652056, -0.14814815034514656 }; double P1(double x, double a) { return x + (a * x) * (x * x); } // 无穷范数误差:7.415237313068701e-9 double sine_approximate(double x) { return P1(P1(P1(x,p[0]),p[1]),p[2]); }
针对float32的实用实现
// 最大ULP误差=2.49524,最大无穷范数误差=9.88345e-08 float p[] = { -0.0020836557, -0.016434766, -0.14814815 };
实用double64实现
// 无穷范数误差:2.22e-16 double p[] = { -0.00002581064752010963, -0.00020280816250387983, -0.00182899436357092772, -0.01646090534492345922, -0.14814814814814814 };
与Remez算法的精度/性能对比


优势:
- 紧凑性(在大量近似场景中至关重要)
- 通用性强
- 具备高阶导数特性
- 区间外优化表现更优
- 近似函数的逆函数实现简单
劣势:
- 无法利用并行计算
- 仅依赖数值最小化,缺乏数学理论支撑
- 尚无选择最优基础函数组合的规则
其他三角函数近似实现
余弦近似可采用1-0.5xP1(P1(P1))的形式实现;正切近似则基于R1 = x / (1.0f + k * x * x)的结构,具体实现如下:
inline float r(float x, float k) { return x / (1.0f + k * x * x); } inline float tan_approx(float x) { // 最大ULP误差=3.82904,最大相对误差=2.70230e-07,最大绝对误差=2.28229e-07 float a = -0.078562208; float b = -0.0089859413; float c = -0.24578492; return r(r(r(x, a), b), c); }

内容的提问来源于stack exchange,提问作者minorlogic
相关产品推荐
相关产品推荐

