Как я могу рассчитать экспоненциальную с использованием 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
Другие вопросы по тегам