У меня есть вопрос относительно того, как обрабатывать некоторые вычисления с фиксированной точкой. Я не могу понять, как это решить. Я знаю, что это легко с плавающей запятой, но я хочу выяснить, как это сделать с фиксированной запятой.
У меня есть система с фиксированной запятой, где я выполняю следующее уравнение для сигнала (vSignal):
Signal_amplified = vSignal * 10^Exp
Максимальная амплитуда vSignal составляет около 4e + 05,
Система позволяет отображать сигналы 2,1475e + 09 (32 бита). Таким образом, для Signal_amplified есть некоторый запас.
По причине простоты, просто предположим, что значение Exp может быть от 0 до 10.
Допустим, первое значение равно 2.8928. Это значение хорошо работает при расчете с плавающей запятой, так как выражение 10 ^ 2.8928 приводит к 781. При использовании округленного значения с плавающей запятой 781 я получаю амплитуды сигнала 3,0085e + 08, хорошо в пределах диапазона сигнала.
Если я попытаюсь представить значение 2.8928 в формате Q, скажем, Q12. Значение меняется на 11849. Теперь 10 ^ 11849 приводит к переполнению.
Как справиться с этими большими числами ?? Я мог бы использовать другое форматирование, такое как Q4, но даже тогда цифры становятся очень большими, а мое становится бедным. Я бы очень хотел иметь возможность вычислять с точностью до 0,001, но я просто вижу, как это сделать.
Минимальный рабочий пример:
int vSignal = 400000
// Floatingpoint -> Goes well
double dExp = 2.89285
double dSignal_amplified = vSignal * std::pow(10,dExp)
// Fixedpoint -> Overflow
int iExp = 11848 // Q12 format
int iSignal_amplified = vSignal * std::pow(10,iExp)
iSignal_amplified = iSignal_amplified>>12
Есть идеи?