2017-01-31 15 views
1

мне нужно вычислить значение с фиксированной точкой для формул:Конвекция с фиксированной точкой: показатель 31 ... 24 с 23 ... 0 дробным значением Q25?

e^(Konst/x*y)

Я использую 3rd Party divide() и antilog() функции, что-то вроде:

div = divide(Konst, x*y); 
out = antilog(div); 

Мой divide() дает на выходе
bits 23…0 fractional part (это фактически Q0.31 формат при смещении << 8)
и
bits 31…24 exponent.

antilog() ожидает на входе Q6.25 значение.

Как я могу передать что-то значащее значение antilog() в формате Q6.25?
Как перейти от одного формата к другому в этом конкретном случае?

p.s. Что произойдет, если divide дает очень большой результат, который не может быть помещен в Q6.25 без масштабирования? В этом случае, как сделать e^(scale*Q6.25)?

+0

Что такое Q6.25? Нет результатов в google. –

+0

@PaulOgilvie: 32-битное фиксированное значение с диапазоном (-64.0, +64.0). – MSalters

+0

@ PaulOgilvie Проверьте https://en.wikipedia.org/wiki/Q_(number_format). – Danijel

ответ

0

«биты 23 ... 0 дробная часть (это на самом деле формат Q0.31 при сдвиге < < 8» Ну, дело в том, что вы не переключитесь на 8, а по экспоненте части (биты 31. +0,24) Обратите внимание, что показатель почти наверняка предвзятым,... биты 00000000 НЕ экспоненту <<0, но возможно >>127 или так (Проверьте документацию)

SO, вычесть смещение, вычитать еще 6 для Q6.25, и сдвиг .

+0

Не предвзято. 'Эта процедура выполняет разделение векторов, записанных в формате Q31. Он возвращает дробную и экспоненциальную часть результата деления. Поскольку деление может генерировать результат больше 1, он возвращает фракционный фрагмент фракции в формате Q (31-exp) и exponent exp, поэтому истинный результат деления в Q0.31 может быть найден путем смещения дробной части, оставшейся по показателю экспоненты. ' – Danijel

+0

Не могли бы вы немного рассказать о «вычитать еще 6 для Q6.25 и сдвинуть»? Что вычитается, что меняется? Пример поможет ... – Danijel

+0

@ Danijel: Вам лучше читать форматы с фиксированной и плавающей запятыми. Посмотрите, как вы представляете значение '2.0' в вашем формате FP, в Q6.25 и Q4.27. Показатель FP означает умножение на '2^exp'. А умножение на мощность 2 - бит-брейк. Следовательно, '* 2^exp' эквивалентен' << exp'. Если мы игнорируем биты, падающие с каждой стороны, '<> b' является' << a-b' предоставлено 'a> b', иначе' >> b-a' – MSalters