Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2016, 19:27   #1
MaratMT
Новичок
Джуниор
 
Регистрация: 21.01.2016
Сообщений: 2
По умолчанию Алгоритм формирования 32-битных чисел с плав. точкой из полученных 16-ти битных integer

Здравствуйте, уважаемые форумчане!
Прошу Вас помочь с задачей. Уповаю на Вас!


Наш контроллер (НК) опрашивает некое устройство (НУ) по неважно какому протоколу.

В НУ адресное пространство реализовано в виде 16-ти битных регистров, но в них хранятся 32-х битные числа с плавающей точкой в формате IEEE 754.

В результате запроса НК получает десять 16-ти битных integer.

Необходимо реализовать алгоритм формирования 32-битных чисел с плав. точкой из полученных 16-ти битных integer.

Алгоритм реализовать на языке ST (можно pascal, Delphi, basic, VBA, С).

Контрольный пример для проверки:

Адресное пространство НУ - R1, R2, R3, R4, …R10.

Переменная Float1 = 1234.5678 располагается в R1 и R2, в двоичном представлении будет 100 0100 1001 1010 0101 0010 0010 1011, а в 16-тиричном 449A522B. То есть результат запроса будет R1=100 0100 1001 1010(449A), R2=0101 0010 0010 1011(522B)

Переменная Float2 = 987654321 располагается в R3, R4;

Переменная Float3 = 0 располагается в R5, R6;

Переменная Float4 = NAN располагается в R7, R8;

Переменная Float5 = 1234.5678 располагается в R9, R10;
MaratMT вне форума Ответить с цитированием
Старый 21.01.2016, 20:03   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Код:
unsigned short int R[10];
float *F = (float *) R;
R[0] = 0x522B;
R[1] = 0x449A;
printf("%f\n", F[0]);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 21.01.2016, 20:54   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Или так
Код:
procedure TForm1.Button1Click(Sender: TObject);
var ps: ^Single;
    Buffer: DWORD;
begin
  Buffer:=$449A522B;
  ps:=@Buffer;
  Edit1.Text:=FloatToStr(ps^);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.01.2016, 13:32   #4
MaratMT
Новичок
Джуниор
 
Регистрация: 21.01.2016
Сообщений: 2
По умолчанию

Благодарю за ответ. К моему сожалению, он не понятен для меня как новичку. Не могли бы вы разжевать, пожалуйста?
MaratMT вне форума Ответить с цитированием
Старый 22.01.2016, 13:46   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var r1,r2: Word;
    Buffer: array[0..1] of Word;
    ps: ^Single;
begin
  r1:=$449A;  //твой R1
  r2:=$522B;  //твой R2
  Buffer[0]:=r2;  //засунули из в 4-ых байтный буфер поменяв местами
  Buffer[1]:=r1;  //двоичное значение этого буфера и есть короткое плавающее
  ps:=@Buffer;    //просто привели его к типу Single поместив в указатель адрес буфера
  Edit1.Text:=FloatToStr(ps^);  // преобразовали к символьному значение и в эдит
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.01.2016, 14:09   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Ещё вариант:
Код:
type
  TMySingleRec = record
  case byte of
    0: (Value: Single); // 4 байта 
    1: (LoWord, HiWord: Word);
  end;
Или так:
Код:
var
  words: array[0..1] of Word;
  x: single absolute words;
Вращайте барабанЪ.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложение 48-битных чисел. Ассемблер zwenya Помощь студентам 1 29.03.2015 19:15
Почему на 64-битных системах не поддерживается расширенная точность операции с плавающей точкой Sibedir Операционные системы общие вопросы 3 06.01.2014 02:21
программа сложения 64-битных чисел olikik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 09.12.2010 23:23
Сложение 64 битных чисел вручную. Как? coolibin Общие вопросы C/C++ 2 19.10.2010 14:06
Принцип хранения 32-битных integer-чисел AndruXa Свободное общение 0 26.04.2008 13:43