通过 LUT 实现指数函数

问题描述

我用LUT实现了指数函数,得到的结果似乎是正确的。我执行此操作的方式是使用中值定理和幂的属性。但例如:如果输入值是x=5.25,这等于:

所以,我的问题是:

  1. 如果要计算的值大于1,是否需要一个新的LUT来计算整数部分? 下面已经回答了立>
  2. 从硬件资源的角度来看,实现指数的最佳方式是什么?在这一点上,我不询问固定点或浮点数。

这是我用 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

enter image description here

编辑 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 个。下图说明了这一点:

enter image description here

enter image description here

很明显,带有 32 个存储值的近似误差的图形小于带有 16 个存储值的图形。 所以,我想第一个问题已经回答了。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...