Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Преобразовать float в число с фиксированной точкой


Автор: debil 27.2.2009, 18:32
Помогите преобразовать число float не более 4-х значащих цифр ( например -135.0 или 45.97) в три-четыре байта, которые будут передаваться в СОМ порт, согласно описания:
 smile 
Цитата

Знаковое число с односторонней десятичной точкой
Имеет знак (S), десятичный порядок (Exponent), выраженный БЕЗЗНАКОВЫМ числом и указывающий положение ДЕСЯТИЧНОЙ точки  (0 для целого числа, 1 для числа с десятыми долями и т.п.) и ненормализованную мантиссу (Mantissa). 
S          - старший бит
Exponent   - 3 следующих бита
Mantissa   - остальные биты (длина мантиссы определяется размером поля данных)

Суммарная длина должна составлять целое число байтов
Значение числа можно вычислить, как
(-1)^S * 10^(-Exponent) * Mantissa
Мантисса может выражаться как в двоичном, так и в двоично-десятичном виде. 
Например:
-10.38 выражается как 0xA01038 при двоично-десятичном представлении мантиссы
или как 0xA40E, то есть на байт короче, при ее двоичном представлении.


 smile 
void Float_To(unsigned char* data, float* value)
{
 smile …….
 smile …….
}

value = StrToFloat(Edit1 -> Text); //..число находится здесь
// какая то проверка  на кол-во знаков

Float24(pf.data_, &value);

Label1 -> Caption = IntToHex(pf.data_[0],2);
Label2 -> Caption = IntToHex(pf.data_[1],2);
Label3 -> Caption = IntToHex(pf.data_[2],2);
Label4 -> Caption = IntToHex(pf.data_[3],2);

 smile  smile  smile  smile 

Из протокола видно:
215.5 передается как  0x18-0x6B-0x00  -или 0001-1000 =0110-1011
21.55 передается как  0x28-0x6B-0x00   -или 0010-1000 =0110-1011
2.155 передается как  0x38-0x6B-0x00   -или 0100-1000 =0110-1011
215.0 передается как  0x00-0xD7-0x00   -или 0000-0000 =1101-0111

255.0 передается как  0x00-0xFF-0x00    -или 0000-0000 =1111-1111
-255.0 передается как  0x80-0xFF-0x00   -или 1000-0000 =1111-1111
-255.5 передается как  0x99-0xFB-0x00   -или 1001-1001 =1111-1011

256.0 передается как  0x01-0x00-0x00      -или 0000-0001 =0000-0000

99.99 передается как  0x20-0x27-0x0F-0x00   -или 0010-0000 =0010-0111=0000-1111

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)