Числа с фиксированной точкой в ​​C без поплавка

Можно ли в C представить число с фиксированной точкой в ​​двоичной форме, чтобы его можно было передать без использования поплавков?

Я знаю, как преобразовать float или double в желаемое представление с фиксированной точкой, но я застрял, когда это нужно сделать без плавающих точек. Проблема в том, что система, на которой я должен разрабатывать, имеет это ограничение.

Моя идея состоит в том, чтобы создать структуру, которая содержит полное представление и обрабатываемую целую и дробную часть. И после создания структуры либо только с полученным двоичным представлением, либо с целыми и дробными значениями должна быть функция, которая выполняет преобразование.

Обновление:

Мой вопрос кажется недостаточно точным, поэтому я добавлю некоторые детали.

В моем коде я должен создавать и получать числа в определенном представлении с фиксированной точкой. Как описано в ответах ниже, это не что иное, как указатель на последовательность битов. Моя проблема в том, что я должен создать эту последовательность битов при отправке или интерпретировать ее при получении информации.

Это преобразование - моя проблема с игнорированием знака, это легко сделать, когда вы можете использовать число с плавающей запятой для преобразования (код не тестировался, но должен работать так):

float sourceValue = 12.223445;    
int intPart = 0;
float fractPart = 0.0;
//integer part is easy, just cast it
intPart = (int)sourceValue;
//the fractinoal part is the rest
fractPart = sourceValue - intPart;


//multipling the fract part by the precision of the fixed point number (Q9.25)
//gets us the fractional part in the desired representation
u_int64_t factor = 1;
factor = factor << 25;
u_int64_t fractPart = fractPart * factor; 

Остальное можно сделать с помощью некоторого сдвига и использования логических битовых операторов.

Но как я могу сделать это без поплавка посередине, начиная с чего-то вроде этого:

int intPart = 12;
int fractPart = 223445;

Это вообще возможно? Как говорится, я тут как бы застрял.

Спасибо за вашу помощь!


person phhe    schedule 06.06.2013    source источник
comment
есть по крайней мере одна библиотека, которая делает это, по крайней мере, вы можете увидеть, как это делается: sourceforge.net /проекты/fixedptc   -  person SirDarius    schedule 06.06.2013
comment
Представление с фиксированной точкой не является числом с плавающей запятой, поэтому я не понимаю, в чем проблема. Что вы пытаетесь преобразовать во что?   -  person interjay    schedule 06.06.2013
comment
@phhe Действительно ли ни один из ответов не помог вам, поскольку вы еще не приняты один из них?   -  person glglgl    schedule 02.08.2013


Ответы (2)


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

Например, если вы хотите выразить число в интервале [0; 1) в 16 бит вы можете отобразить его в диапазоне [0; 65536), просто умножив его на 65536.

При этом это полностью зависит от того, как выглядят ваши целочисленные значения и как они должны быть представлены. Почти в любом случае вы можете применить к нему умножение или деление, и готово.

person glglgl    schedule 06.06.2013

Все сводится к битам, будь то целое число, число с плавающей запятой и т. д. Все, что вам нужно, это базовый адрес памяти и размер этой определенной памяти. Например,

float src = 0.5;
float dest;
char bytes[sizeof(src)];    

memcpy(bytes, &num, sizeof(src));
dest = *((float *)bytes);

должен дать вам dest равный src.

Надеюсь, это помогло.

person n3rd4n1    schedule 06.06.2013