Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразовать float в число с фиксированной точкой 
:(
    Опции темы
debil
  Дата 27.2.2009, 18:32 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.12.2007

Репутация: нет
Всего: нет



Помогите преобразовать число 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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.