Как я могу рассчитать экспоненциальную с использованием CORDIC для чисел за пределами [-1, 1]?
Я не в состоянии понять математику, лежащую в основе вычисления экспоненты числа вне диапазона [-1, 1) (на самом деле я не уверен, что это хороший диапазон для вычисления exp с использованием CORDIC, в каком-то месте, где я читал [-pi/4, pi/4] и в других я прочитал [-1, 1)) с использованием алгоритма CORDIC. Может кто-нибудь привести пример?
Я прочитал следующее заявление по адресу http://zone.ni.com/reference/en-XX/help/371599G-01/lvfpga/ht_exponential/:
"x должен находиться в диапазоне [–1, 1). Чтобы вычислить exp(x), когда x находится вне этого диапазона, найдите целое число q и действительное число r, где r находится в диапазоне [0, ln(2)), так что x = q × ln(2) + г. Затем вы можете вычислить 2^q × exp(r), что эквивалентно exp(x). Поскольку r находится в допустимом диапазоне [–1, 1), вы можете использовать эту функцию для вычисления exp(r)."
Но это не имеет особого смысла для меня, как я могу найти q и r?
Второй подход, который я нашел, был по адресу http://www.xilinx.com/support/documentation/application_notes/xapp552-cordic-floating-point-operations.pdf который подсказывает нам использовать уравнения после деления числа на целую и дробную часть:
cosh(int + frac) = cosh(int) * cosh(frac) + sinh(int) * sinh(frac)
sinh(int + frac) = cosh(int) * sinh(frac) + cosh(frac) * sinh(int)
cosh (int) и sinh(int) взяты из справочной таблицы. Но этот подход требует больших вычислительных ресурсов, поэтому я предпочитаю предыдущий.
1 ответ
Если x = q × ln(2) + r
затем
exp(x) = exp(q × ln(2) + r)
= exp(ln(2))^q exp(r)
= 2^q exp(r)
Это означает, что если вы можете найти q
а также r
найти показатель будет легко, нужно просто сдвинуть бит 2 (2<<(q-1)
) находить exp(r)
и умножить их вместе.
Найти q
а также r
первая нота ln(2)=0,6931471805599453. Если у вас есть разделение доступно
q = floor( x / ln(2) )
r = x - q * ln(2)
если у вас нет деления, вы можете использовать цикл
q = 0
while( x > ln(2) ) {
x -= ln(2)
++q
}
r = x