Как вручную преобразовать фиксированный тип в плавающий? - PullRequest
0 голосов
/ 29 ноября 2018

Я использую библиотеку с фиксированной точкой переменными. Библиотека называется libfixmath .

Я пытаюсь увидеть, как число преобразуется изfix16_t к типу с плавающей точкой.Я понимаю, что для представления числа используются 32 бита (16 битов MSB для целых и 16 битов LSB).

Это код, который я пробовал, здесь "sum" имеет тип fix16_t.

float in_sum = fix16_to_float(sum);
printf("fix16 type sum:%u\n",sum);
printf("float type sum:%f\n",in_sum);

Я отображаю «сумму» в целочисленном формате без знака, опять же я не уверен, что лучший формат для отображения значения «сумма».

Пример вывода, который я получил:

fix16 type sum:4064807395
float type sum:-3511.961426

Я посмотрел на функцию преобразования:

static inline float   fix16_to_float(fix16_t a) { return (float)a / fix16_one; }

Где fix16_one равно 65536.

Чтобы лучше понять, я хочу иметь возможность преобразовать этовручную, но я не знаю как.Я запутался с приведением типа (float)a.

Еще один вопрос, который у меня есть, это 16 целых битов со знаком или без знака?

1 Ответ

0 голосов
/ 29 ноября 2018

Если fix16_t является целочисленным типом, то a / 65536 будет целочисленным делением без десятичных дробей.Например, 65535 / 65536 - это не значение с плавающей запятой 0.99998, а целочисленное значение 0.

Приведение a преобразует a и, следовательно, все выражение в деление с плавающей запятой,с десятичными дробями.


Использование значений:

  1. Целочисленное деление: -230159901 / 65536 приведет к значению integer -3511.
  2. Деление с плавающей запятой: (float)-230159901 / 65536 приведет к значению float -3511.961426.
...