как конвертировать float в fix16_14? - PullRequest
0 голосов
/ 23 апреля 2019

Как преобразовать число с плавающей запятой в формат с фиксированной запятой fix16_14 в C. fix16_14 означает 2-битное целое и 14-битную дробь?Рассмотрим пример: -0,9963 = c03c в шестнадцатеричном виде (представление в виде дополнения до двух).Пожалуйста, помогите мне с этой логикой кода C.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Преобразование выполняется путем умножения float на 16384.0. Обязательно округлите результат. Кроме того, поскольку имеется только 2 целых бита, число должно находиться в диапазоне -2 <= x < 2. В противном случае расчет будет переполнен.

Вот пример кода:

#include <stdio.h>
#include <inttypes.h>
#include <math.h>

int main(void)
{
    float x = -0.99633;
    short int y = round(x * 16384.0);
    printf("%#04hx\n", (unsigned short)y);
}

Выходные данные из кода: 0xc03c

0 голосов
/ 23 апреля 2019

Номер с фиксированной точкой

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

Для концептуального определения типа фиксированной точки нам нужны только два параметра:

  • ширина представления числа,и
  • положение двоичной точки в числе

Мы будем использовать обозначения, зафиксированные в остальной части этой статьи, где w обозначает количество битов, используемых в целом (шириначисло), а b обозначает позицию двоичной точки, считая от младшего значащего бита (считая от 0).

..................................

Например, фиксированный <8,3> обозначает 8-битное число с фиксированной запятой, из которых 3 самых правых бита являются дробными.Следовательно, битовая комбинация:

0 0 0 1 0 1 1 0

представляет действительное число:

00010.1102

= 1 * 2 ^ 1+ 1 * 2 ^ -1 + 1 * 2 ^ -1

= 2 + 0,5 + 0,25

= 2,75

Обратите внимание, что на компьютере немного скороговорка можетпредставляет что угодно.Поэтому тот же битовый шаблон, если мы «приведем» его к другому типу, например, к фиксированному типу <8,5>, будет представлять число:

000.101102

= 1 * 2 ^-1 + 1 * 2 ^ -3 + 1 * 2 ^ -4

= 0,5 + 0,125 + 0,0625

= 0,6875

Если мы будем рассматривать этот битовый шаблон как целое число, он представляет число:

101102

= 1 * 2 ^ 4 + 1 * 2 ^ 2 + 1 * 2 ^ 1

= 16 + 4 + 2

= 22 * ​​1052 *

Использование номера с фиксированной точкой в ​​C

C не имеет собственного "типа" для номера с фиксированной точкой.Однако из-за природы представления с фиксированной запятой она нам просто не нужна.Напомним, что все арифметические операции с числами с фиксированной точкой совпадают с целыми числами, мы можем просто повторно использовать целочисленный тип int в C для выполнения арифметики с фиксированной точкой.Положение двоичной точки имеет значение только в тех случаях, когда мы печатаем ее на экране или выполняем арифметику с другим «типом» (например, при добавлении int к fixed <32,6>).

...