man*_*mic 4 fixed-point approximation
目前,我正在使用一个小型查找表和线性插值,它非常快且足够准确(最大误差小于 0.001)。然而我想知道是否有一个更快的近似值。
由于指数的整数部分可以通过位移来提取和计算,因此近似值只需要在 [-1,1] 范围内工作我尝试找到切比雪夫多项式,但对于低多项式无法达到良好的精度命令。我猜我可以忍受 0.01 左右的最大误差,但我没有接近这个数字。高阶多项式不是一种选择,因为它们比我当前的基于查找表的解决方案效率低得多。
由于没有说明特定的定点格式,我将演示使用s15.16相当常用的定点算术进行表查找的可能替代方案。基本思想是将输入a分为整数部分i和小数部分f,使得f在 [-0.5,0.5] 中,然后对 [-0.5, 0.5] 使用极小极大多项式近似exp2(f),并基于 执行最终缩放i。
可以使用 Mathematica、Maple 或 Sollya 等工具生成极小极大近似。如果这些工具均不可用,则可以使用 Remez 算法的自定义实现来生成极小极大近似值。
应使用霍纳方案来评估多项式。由于使用定点算术,多项式的求值应在中间步骤中将操作数缩放到最大可能范围(即没有溢出),以优化计算的精度。
下面的 C 代码假设应用于有符号整数数据类型的右移会导致算术移位运算,因此负操作数会被适当移位。ISO C 标准不能保证这一点,但根据我的经验,它可以与各种工具链一起正常工作。在最坏的情况下,内联汇编可用于强制生成所需的算术右移指令。
下面的实现中包含的测试输出fixed_exp2()应如下所示:
testing fixed_exp2 with inputs in [-5.96484, 15)
max. rel. err = 0.000999758
Run Code Online (Sandbox Code Playgroud)
这表明区间 [-5.96484, 15) 内的输入满足所需的 0.001 误差界限。
testing fixed_exp2 with inputs in [-5.96484, 15)
max. rel. err = 0.000999758
Run Code Online (Sandbox Code Playgroud)