#python #math #fpga #exp
#python #математика #fpga #exp
Вопрос:
Я реализовал экспоненциальную функцию с помощью LUT, и полученные результаты кажутся правильными. Способ, которым я это выполнил, использовал теорему о промежуточных значениях и свойства степеней. Но, например: если входное значение равно x=5.25
, это равно:
Итак, мои вопросы:
Если вычисляемое значение больше единицы, требуется ли новый 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
Чтобы ответить на мой первый вопрос: если вычисляемое значение больше единицы, требуется ли новый 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 с большим количеством значений. Вместо 16 установите 32 сохраненных значения. Следующие графики демонстрируют это:
Понятно, что графики с ошибкой аппроксимации для 32 сохраненных значений меньше, чем с 16 сохраненными значениями. Итак, я думаю, что на первый вопрос уже дан ответ.