不动点中“atan”函数的逼近

Approximation of `atan` function in fixed point

我必须做一些需要使用三角函数的计算,尤其是 atan 那个。该代码将在 Atmega328p 上 运行,为了提高效率,我不能使用 floats:我使用的是定点数。因此,我不能使用标准的 atan 函数。

我有一个函数,它采用定点格式 s16_10(有符号,16 位宽度,点在第 10 个位置)和 returns s16_6 格式的值.输入将介于 0 和 1 之间(因此 0 和 210),因此以度为单位的输出将介于 -45 和 45 之间(因此 -45 * 26 和 45 * 26).

假设Y是不动点,s16_6表示y,圆弧的真实角度,而x如atan(x) = y,X的s16_10表示X。我从使用 4 次多项式从 (0,1) 到 (-45,45) 逼近 atan 函数开始,发现我们可以使用:

y ~= 8.11 * x^4 - 19.67 * x^3 - 0.93 * x^2 + 57.52 * x + 0.0096

这导致:

Y ~= (8.11 * X^4)/2^34 - (19.62* X^3)/2^24 - (0.93 * X^2)/2^14 + (57.52*X)/2^4 + 0.0069 * 2^6

我卡在这里了...一方面,计算 X^4 将导致定义间隔的五分之一为 0,另一方面,2 {3, 2, 1} 中的 n4n 通常也会导致零值...我该怎么做?

某些术语被截断为零不一定是灾难;这不会显着恶化您的近似值。我通过将多项式的每一项舍入到最接近的整数来模拟您在 Matlab 中的固定精度设置:

q4 = @(X) round((8.11 * X.^4)/2^34);
q3 = @(X) -round((19.62* X.^3)/2^24);
q2 = @(X) -round((0.93 * X.^2)/2^14);
q1 = @(X) round((57.52*X)/2^4);
q0 = @(X) round(0.0069 * 2^6);

的确,在区间 [0,210] 的第一个五分之一处,项 q4、q3、q2 看起来相当不稳定,而 q4 基本上不存在。

但是这些四舍五入的影响与多项式 atan 的近似理论误差的大小大致相同。这是图中红色是 没有 舍入到整数的差值(多项式-atan),绿色是差值(q4+q3+q2+q1+q0-atan):

如您所见,四舍五入并没有使近似值变得更糟;在大多数情况下,它实际上通过一个愉快的意外减少了错误。


我确实注意到您的多项式系统地高估了 atan。当我用 Matlab 将 4 次多项式拟合到 [0,1] 上的 atan 时,系数略有不同:

8.0927  -19.6568   -0.9257   57.5106   -0.0083

即使像您一样将这些截断为两位有效数字,我也会得到更好的近似值:

(8.09 * X^4)/2^34 - (19.66* X^3)/2^24 - (0.93 * X^2)/2^14 + (57.52*X)/2^4 - 0.0083 * 2^6

这次截断为整数确实使事情变得更糟。但可以预料的是,将几个中间结果四舍五入为整数的计算结果将相差 +-2 左右。此多项式显示的 +-0.5 的理论精度无法使用给定的算术工具实现。