@WTFAYD

Как происходит преобразование из fixed-point числа в floating-point?

Задача: нужно преобразовать число с фиксированной точкой в число с плавающей точкой. Нашел в интернете код, немножко переделал под себя и скомпилировал:

int a = 0x001A8000; // Q16.16, число 26.5
float b = a/65536.0;

Код действительно работает.

Подскажите пожалуйста, зачем в данном случае переменная a делится на 65536 (2^16, как я полагаю, связано с количеством разрядов для целой и дробной части)? Как это математически обосновывается?

P.S. Нашел в википедии, что X = X' * Z, где X - число с фиксированной точкой (в моем случае b), X' - целочисленное представление (в моем случае а), а z - 2^-f - вес младшего разряда. Но почему в нашем случае f равно 16 и почему именно используется 2^-f?
  • Вопрос задан
  • 393 просмотра
Пригласить эксперта
Ответы на вопрос 1
15432
@15432
Системный программист ^_^
Конкретно в вашем примере происходит вот что:
1) переменной "а" присваивается значение 1736704
2) переменная "а" переводится в float, получается значение 1736704.0
3) производится деление чисел с плавающей точкой- 1736704.0 на 65536.0
4) результат деления (26.5) записывается в переменную "b"

Настоящее преобразование чисел, о котором вы и спрашиваете, происходит только на шаге 2. В архитектуре x86 оно происходит с использованием специальных ассемблерных команд и floating-point сопроцессора. То есть быстро и автоматически. В более простых архитектурах это может быть реализовано программно (всего лишь вычислить экспоненту и мантиссу)
https://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы