Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: числа с плавающей запятой
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Математика и Физика
Vovanchik
Здравствуйте!

Имеется 4 байта представляющих число с плавающей запятой типа float (32 бита).
Как правильно организовать присвоение переменной типа float значения описанного в этих байтах.
Подскажите пожалуйста алгоритм.

Код
float F;
char Ch1, Ch2, Ch3, Ch4;

F = ??? (Ch1 + Ch2 + Ch3 + Ch4);


Пробую так, но может есть что-либо правильнее:
Код
float s;
signed short e;
long long m;    

e = (((Ch1 & 0x7F) << 1) | (Ch2 & 0x80 >> 7)) - 127; //экспонента
m = (0x800000 | (((Ch1 & 0x7F) << 16) | (Ch2 << 8) | Ch3)); //мантисса
m >>= 23 - e;
s = pow(-1, Mass[0] >> 7); //знак
return(s * m);
tag
Цитата(Vovanchik @ Sep 17 2008, 10:10) *
Здравствуйте!

Имеется 4 байта представляющих число с плавающей запятой типа float (32 бита).
Как правильно организовать присвоение переменной типа float значения описанного в этих байтах.
Подскажите пожалуйста алгоритм.

Код
float F;
char Ch1, Ch2, Ch3, Ch4;

F = ??? (Ch1 + Ch2 + Ch3 + Ch4);


Пробую так, но может есть что-либо правильнее:
Код
float s;
signed short e;
long long m;    

e = (((Ch1 & 0x7F) << 1) | (Ch2 & 0x80 >> 7)) - 127; //экспонента
m = (0x800000 | (((Ch1 & 0x7F) << 16) | (Ch2 << 8) | Ch3)); //мантисса
m >>= 23 - e;
s = pow(-1, Mass[0] >> 7); //знак
return(s * m);


...если просто присвоить, вернее скопировать то так
Код
float F;

char Ch1, Ch2, Ch3, Ch4;

((char*) &F)[0] = Ch1;
((char*) &F)[1] = Ch2;
((char*) &F)[2] = Ch3;
((char*) &F)[3] = Ch4;
Vovanchik
Цитата(tag @ Sep 17 2008, 10:56) *
...если просто присвоить, вернее скопировать то так
Код
float F;

char Ch1, Ch2, Ch3, Ch4;

((char*) &F)[0] = Ch1;
((char*) &F)[1] = Ch2;
((char*) &F)[2] = Ch3;
((char*) &F)[3] = Ch4;


спасибо a14.gif
fakel
А мне почему-то кажется, что ещё легче будет так:

union{
float f;
char c[4];
} fnum;

fnum.c[0]=0x00; //присваеваем требуемые значения
fnum.c[1]=0x00;
fnum.c[2]=0x00;
funm.c[3]=0x00;

//полученное число с плавоющей точкой будет лежать в fnum.f
rezident
Порядок следования байт еще и от индианности (big endian или little endian) зависит ИМХО.
scifi
Это вечная тема smile.gif Что-то похожее обсуждалось, к примеру, тут:
http://electronix.ru/forum/index.php?showtopic=45459&hl=
Как известно, есть разные подходы: объединения, битовые сдвиги и маски, манипуляции через указатели. Некоторые подходы зависят от архитектуры (big endian, little endian, особенности компилятора), другие - не зависят...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.