[an error occurred while processing this directive]
|
Правила умножения очень просты. Есть один сомножитель в формате m1.n1 (m1 - число разядов под целую часть, n1 - под дробную), есть второй в формате m2.n2. Результат будет в формате (m1+m2).(n1+n2), если используется целочисленный режим умножения. Или (m1+m2-1).(n1+n2+1) Если используется fractional режим умножения, т.е. с доп. сдвигом результата влево на 1. Вот Вам пример. Код 0x4000. Это 0.5 в формате 1.15 и 1.0 в формате 2.14. Или 16384 в формате 16.0 Надо возвести его в квадрат. Умножитель о Ваших хитростях с форматами ничего не знает.
Во всех случаях при целочисленном режиме умножения на выходе умножителя будет код 0x1000 0000. И Вы его интерпретируете в соответствии с выбранным форматом. Т.е. если формат 1.15, то 30 младших разрядов - дробная часть, 2 старших -целая. Целая =0, а дробная (в дв. виде)=010000...0. И получаеттся 0.25. В формате 2.30.
В формате 2.14 младшие 28 разрядов - дробная часть, 4 старших целая.
Видно, что младшие 28=0, старшие 4 =0001. И это 1. В формате 4.28. Аналогично для формата 16.0 Все отводится под целую часть. И она равна 16384^2.
Если, например, в случае с форматом 2.14 Вам не нужно 32-х разрядное
представление результата и к тому же у Вас есть уверенность, что целая часть результата при любом раскладе у Вас будет в диапазоне от -2 до +1, т.е. на нее достаточно 2 разрядов, то Вы можете результат сдвинуть влево на 2 и оставить старишие 16 разрядов. Они, как и вход, будут в формате 2.14.
Аналогично с fractional режимом.
E-mail: info@telesys.ru