Арифметика с фиксированной точкой - PullRequest
3 голосов
/ 05 декабря 2010

В настоящее время я использую Microchip's Fixed Point Library, но я думаю, что это применимо к большинству библиотек с фиксированной точкой.Он поддерживает типы Q15 и Q15.16, соответственно 16-битные и 32-битные данные.

Одна вещь, которую я заметил, состоит в том, что она не включает функции сложения, вычитания, умножения или деления.

Как я должен это сделать?Это так же просто, как просто сложение / вычитание / умножение / деление их вместе с помощью целочисленной математики?Я вижу, как сложение и вычитание работают, но умножение или деление не позаботятся о дробной части ...?

Ответы [ 2 ]

1 голос
/ 25 июня 2015

Библиотека Microsoft включает функции для сложения и вычитания, которые имеют дело с недостаточным / переполнением (_Q15add и _Q15sub).

Умножение может быть реализовано как функция сборки (я думаю, что код хорош - это из памяти).

C вызывающий прототип:

extern _Q15 Q15mpy(_Q15 a, _Q15 b);

Подпрограмма (помещенная в исходный файл .s в вашем проекте):

.global _Q15mpy
_Q15mpy:
mul.ss w0, w1, w2        ; signed multiple parameters, result in w2:w3
SL w2, w2            ; place most significant bit of W2 in carry
RLC w3, w0           ; rotate left carry into w3; result in W0
return                        ; return value in W0

.end

Не забудьте включить libq.h

Эта процедура выполняет сдвиг влево на один бит вместо сдвига вправо на 15 бит для результата.Нет проблем переполнения, потому что числа Q15 всегда имеют величину <= 1. </p>

0 голосов
/ 06 декабря 2010

Оказывается, что все основные арифметические функции выполняются с использованием собственных операторов из-за того, как представлены числа. например Деление использует оператор / и умножает оператор *, и они компилируются в простые 32-разрядные деления и умножения.

...