如何解决通过 LUT 实现指数函数
我用LUT实现了指数函数,得到的结果似乎是正确的。我执行此操作的方式是使用中值定理和幂的属性。但例如:如果输入值是x=5.25
,这等于:
所以,我的问题是:
-
如果要计算的值大于1,是否需要一个新的LUT来计算整数部分?下面已经回答了立> - 从硬件资源的角度来看,实现指数的最佳方式是什么?在这一点上,我不询问固定点或浮点数。
这是我用 LUT 实现的指数函数,以及与实际指数函数进行比较的结果:
e_constant = 2.718281828459045235360
depth = 16
idx = 1/(2**np.arange(1,depth+1))
LUT_p = np.exp(1/(2**np.arange(1,depth+1)))
LUT_n = np.exp(-1/(2**np.arange(1,depth+1)))
def EXP_LUT(x):
acc = 0 # Accumulator
exp = 1 # Returned value
if x == 0:
return 1
if x == 1:
return e_constant
for i in range(depth):
if acc < x:
acc = acc + idx[i]
exp = exp * LUT_p[i]
elif acc > x:
acc = acc - idx[i]
exp = exp * LUT_n[i]
else:
break
return exp
编辑 1
为了回答我的第一个问题:如果要计算的值大于1,是否需要一个新的LUT来计算整数部分?
一个非常合乎逻辑的解决方案是更改 LUT 的最大值。 例如:
# This works great to ranges between -1 and 1
LUT_i = 1/(2**np.arange(1,depth+1))
LUT_p = np.exp(LUT_i)
LUT_n = np.exp(-LUT_i)
# This works great to ranges between -8 and 8
LUT_i = 8/(2**np.arange(1,depth+1))
LUT_p = np.exp(LUT_i)
LUT_n = np.exp(-LUT_i)
这里的问题是近似中的精度损失,为了解决这个问题(只有在确实需要时),解决方案是创建一个具有更多值的 LUT。设置为 32 个存储值而不是 16 个。下图说明了这一点:
很明显,带有 32 个存储值的近似误差的图形小于带有 16 个存储值的图形。 所以,我想第一个问题已经回答了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。