Как вы делаете дробное (фиксированное) деление двух чисел Q31 в C? - PullRequest
0 голосов
/ 12 мая 2019

Я хочу разделить число с фиксированной запятой (Q31 / int32, представляющее дробное число с 31 дробным битом) на другой Q31 / int32. Я хочу вычислить z = y / x, зная, что abs (x)> abs (y). Следовательно, z <1, поэтому его можно представить как другой Q31 / int32. Поэтому я подумал, что мне нужно будет сдвинуть Y влево на 32 бита и привести его к типу int64. Тогда я смогу делить на int32 (приведение не обязательно, но для ясности) и приведение обратно к int32: </p>

int32_t  x, y = ?? ;
int32_t  z = (int32_t)( ((int64_t)y<<32) / ((int32_t)x) );

Но это не работает. Вы видите какую-либо очевидную ошибку?

1 Ответ

0 голосов
/ 12 мая 2019

Моя проблема заключалась в том, что эти два числа - Q31, и я хочу получить ответ Q31, поэтому мне нужно иметь числитель Q1.62 в моем подразделении. Мой код эффективно использовал числитель Q63 и делился на Q31, и в результате получился результат, который был ограничен диапазоном [-0,5,0,5) вместо [-1,1).

Решение состоит в том, чтобы сдвинуть бит на 31 вместо 32, чтобы получить числитель Q1.62, что теперь имеет гораздо больше смысла, и я больше думаю о том, что делаю.

...