[an error occurred while processing this directive]
|
что бы не терялося.
в общем то тамма все просто...
есть число A и B
представляем (в уме :) )
A = a * 2^n
B = b * 2^m
хотим С = A * B
и получим
с = a * 2^n * b * 2^m = a*b * 2^(n+m) = с * 2^(k)
нам все (n+m) не надо - поэтому мы чего то выкидываем - сдвигаем вправо
с = с >> l = с * 2^(k-l)
пример
n=m=15
хотим результат том же масштабе * 2^15
после умножения емеем k = 30
если хотим опять только 15 бит - то будь добрь вправо сдвинуть на 15 - выбросить 15 бит последних малозначащих так сказать
дальше немного больше - все это хозяйство имеет место жить в конкретных регистрах - до умножения в 16 битных, после (например)в 32
ну и тут народ заметил на досуге (для наших 15),
что вместо того что бы двигать все вправо на 15 - можно влево на 1 - и тада в старшей половинке 32 битника получиться наш результат.
Если пользовать Q13 - то все тоже самое - вопрос только в каком масштабе вам надо результат?
чем хорошь Q15 - точнее 1Q15 - тем что (1Q15*1Q15 >> 15) опять 1Q15
а вот (3Q13*3Q13 >> 13) вовсе не обязательно поместиться в 3Q13 - нада быть астарожным в выборе множителей. - или масштабировать результат умножения.
E-mail: info@telesys.ru