问题描述
我用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 (将#修改为@)