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