Q (числовой формат)
Обозначение Q — это способ указать параметры двоичного формата чисел с фиксированной запятой . Например, в нотации Q числовой формат, обозначаемый Q8.8
означает, что числа с фиксированной точкой в этом формате имеют 8 бит для целой части и 8 бит для дробной части.
ряд других обозначений С той же целью использовался .
Определение
[ редактировать ]Версия Texas Instruments
[ редактировать ]Обозначение Q, определенное Texas Instruments , [1] состоит из буквы Q, за которым следует пара чисел m . n , где m — количество битов, используемых для целой части значения, а n — количество дробных битов.
По умолчанию эта запись описывает знаковый двоичный формат с фиксированной запятой, при этом немасштабированное целое число хранится в формате дополнения до двух , используемом в большинстве двоичных процессоров. Первый бит всегда указывает знак значения (1 = отрицательный, 0 = неотрицательный) и не учитывается в параметре m . Таким образом, общее количество w используемых битов равно 1 + m + n .
Например, спецификация Q3.12 описывает знаковое двоичное число с фиксированной запятой, всего w = 16 бит, включая знаковый бит, три бита для целой части и 12 бит, которые являются дробной частью. То есть 16-битное целое число со знаком (дополнение до двух), которое неявно умножается на коэффициент масштабирования 2. −12
В частности, когда n равно нулю, числа являются просто целыми числами. Если m равно нулю, все биты, кроме знакового бита, являются дробными битами; тогда диапазон сохраненного числа составляет от -1,0 (включительно) до +1,0 (исключительно).
М и точку можно опустить, и в этом случае они определяются на основе размера переменной или регистра, в котором хранится значение. Таким образом, Q12 означает целое число со знаком с любым количеством бит, которое неявно умножается на 2. −12 .
Письмо U может иметь префикс Q для обозначения беззнакового двоичного формата с фиксированной запятой. Например, UQ1.15 описывает значения, представленные как беззнаковые 16-битные целые числа с неявным коэффициентом масштабирования 2. −15 , которые находятся в диапазоне от 0,0 до (2 16 −1)/2 15 = +1.999969482421875.
ARM-версия
[ редактировать ]Вариант обозначения Q использовался ARM . В этом варианте число m включает знаковый бит. Например, 16-битное целое число со знаком будет обозначаться Q15.0
в варианте TI, но Q16.0
в варианте ARM. [2] [3]
Характеристики
[ редактировать ]Разрешение (разница между последовательными значениями) Q m . n или UQ м . формат n всегда равен 2 − п . Диапазон представимых значений зависит от используемых обозначений:
Обозначения | Обозначения Texas Instruments | Обозначение ARM |
---|---|---|
Подпись Q м . н | −2 м до +2 м − 2 − п | −2 м −1 до +2 м −1 − 2 − п |
Беззнаковый UQ м . н | от 0 до 2 м − 2 − п | от 0 до 2 м − 2 − п |
Например, номер формата Q15.1 требует 15+1 = 16 бит и имеет разрешение 2. −1 = 0,5, а представимые значения варьируются от −2 14 = от −16384,0 до +2 14 − 2 −1 = +16383,5. В шестнадцатеричном формате отрицательные значения варьируются от 0x8000 до 0xFFFF, за которыми следуют неотрицательные значения от 0x0000 до 0x7FFF.
Математические операции
[ редактировать ]Числа Q представляют собой отношение двух целых чисел: числитель хранится в памяти, знаменатель равно 2 н .
Рассмотрим следующий пример:
- Знаменатель Q8 равен 2 8 = 256
- 1,5 равно 384/256
- 384 сохраняется, 256 выводится, поскольку это число Q8.
Если необходимо сохранить базу числа Q ( n остается постоянным), математические операции с числом Q должны сохранять знаменатель. постоянный. Следующие формулы показывают математические операции с общими числами Q. и . (Если мы рассмотрим пример, упомянутый выше, это 384 и это 256.)
Поскольку знаменатель представляет собой степень двойки, умножение можно реализовать как арифметический сдвиг влево, а деление — как арифметический сдвиг вправо; на многих процессорах сдвиги выполняются быстрее, чем умножение и деление.
Для обеспечения точности промежуточные результаты умножения и деления должны иметь двойную точность, и необходимо соблюдать осторожность при округлении промежуточного результата перед преобразованием обратно в желаемое число Q.
При использовании C выполняются следующие операции (обратите внимание, что здесь Q относится к количеству битов дробной части):
Добавление
[ редактировать ]int16_t q_add(int16_t a, int16_t b)
{
return a + b;
}
С насыщенностью
int16_t q_add_sat(int16_t a, int16_t b)
{
int16_t result;
int32_t tmp;
tmp = (int32_t)a + (int32_t)b;
if (tmp > 0x7FFF)
tmp = 0x7FFF;
if (tmp < -1 * 0x8000)
tmp = -1 * 0x8000;
result = (int16_t)tmp;
return result;
}
В отличие от чисел с плавающей запятой ±Inf, насыщенные результаты не являются липкими и станут ненасыщенными при добавлении отрицательного значения к положительному насыщенному значению (0x7FFF) и наоборот в показанной реализации. В языке ассемблера флаг Signed Overflow можно использовать, чтобы избежать приведения типов, необходимых для этой реализации C.
Вычитание
[ редактировать ]int16_t q_sub(int16_t a, int16_t b)
{
return a - b;
}
Умножение
[ редактировать ]// precomputed value:
#define K (1 << (Q - 1))
// saturate to range of int16_t
int16_t sat16(int32_t x)
{
if (x > 0x7FFF) return 0x7FFF;
else if (x < -0x8000) return -0x8000;
else return (int16_t)x;
}
int16_t q_mul(int16_t a, int16_t b)
{
int16_t result;
int32_t temp;
temp = (int32_t)a * (int32_t)b; // result type is operand's type
// Rounding; mid values are rounded up
temp += K;
// Correct by dividing by base and saturate result
result = sat16(temp >> Q);
return result;
}
Разделение
[ редактировать ]int16_t q_div(int16_t a, int16_t b)
{
/* pre-multiply by the base (Upscale to Q16 so that the result will be in Q8 format) */
int32_t temp = (int32_t)a << Q;
/* Rounding: mid values are rounded up (down for negative values). */
/* OR compare most significant bits i.e. if (((temp >> 31) & 1) == ((b >> 15) & 1)) */
if ((temp >= 0 && b >= 0) || (temp < 0 && b < 0)) {
temp += b / 2; /* OR shift 1 bit i.e. temp += (b >> 1); */
} else {
temp -= b / 2; /* OR shift 1 bit i.e. temp -= (b >> 1); */
}
return (int16_t)(temp / b);
}
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Приложение А.2». Справочник программиста библиотеки DSP TMS320C64x (PDF) . Даллас, Техас, США: Texas Instruments Incorporated . Октябрь 2003 г. СПРУ565. Архивировано (PDF) из оригинала 22 декабря 2022 г. Проверено 22 декабря 2022 г. (150 страниц)
- ^ «Руководство по отладчикам ARM Developer Suite AXD и Armsd» . 1.2. АРМ Лимитед . 2001 [1999]. Глава 4.7.9. AXD > Возможности AXD > Форматирование данных > Q-формат. ARM DUI 0066D. Архивировано из оригинала 04.11.2017.
- ^ «Глава 4.7.9. AXD > Возможности AXD > Форматирование данных > Q-формат». Руководство по отладчикам RealView Development Suite AXD и Armsd (PDF) . 3.0. АРМ Лимитед . 2006 [1999]. стр. 4–24. ARM DUI 0066G. Архивировано (PDF) из оригинала 4 ноября 2017 г.
Дальнейшее чтение
[ редактировать ]- Оберстар, Эрик Л. (30 августа 2007 г.) [2004]. «Представление с фиксированной запятой и дробная математика» (PDF) . 1.2. Оберстар Консалтинг. Архивировано из оригинала (PDF) 4 ноября 2017 г. Проверено 4 ноября 2017 г. (Примечание: точность статьи оспаривается; см. обсуждение.)
Внешние ссылки
[ редактировать ]- «Реализация Java в формате Q-числа» . Гитхаб . Архивировано из оригинала 4 ноября 2017 г. Проверено 4 ноября 2017 г.
- «Конвертер Q-формата» . Архивировано из оригинала 25 июня 2021 г. Проверено 25 июня 2021 г.
- «Библиотека Q (реализация C)» . Гитхаб . Проверено 5 марта 2024 г.