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

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

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2022, 21:19   #1
DrGrizzly
Новичок
Джуниор
 
Регистрация: 05.12.2022
Сообщений: 6
По умолчанию IEEE 754 дробное в HEX

Всем привет! Второй день бьюсь в поисках решения задачки, получаю из контроллера температуру в HEX, нашел алгоритм, который преобразовал в DEC значение. Но теперь стоит обратная задача, из указанного DEC преобразовать в HEX по стандарту IEEE 754. Весь зарылся в статьях и вычислениях, но все равно упираюсь в стенку. Помогите разобрать пример (руководствуясь данной статьей Пример) не хватает полного понимания, чтобы написать алгоритм.

Рассмотрим значение 100.
Открываю калькулятор - смотрю двоичное значение = 0110 0100.
Представляю его в нормализованном виде как мантисса 1.00 и экспонента exp(10^2)
Дальше вроде надо добавить 1 в начало, получим 1011 0010 0000 и на этом фантазия закончилась...
Ща понимаю что значение 1011 0010 это 178, что больше 127. Значит 178 - 127 = 51, но что с этим дальше делать, не понимаю... (из примера на этой строке у меня ступор - 1,55625∙exp10^+2 = 1,0011011101∙exp2^+111, от куда тут появилось exp2+111)
DrGrizzly вне форума Ответить с цитированием
Старый 05.12.2022, 21:30   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от DrGrizzly Посмотреть сообщение
(из примера на этой строке у меня ступор - 1,55625∙exp10^+2 = 1,0011011101∙exp2^+111, от куда тут появилось exp2+111)
Читать свою статью дальше не пробовали?
p51x вне форума Ответить с цитированием
Старый 05.12.2022, 21:39   #3
DrGrizzly
Новичок
Джуниор
 
Регистрация: 05.12.2022
Сообщений: 6
По умолчанию

Дак вот в этом и загвоздка. Они дальше ссылаются "То есть, если наша экспоната = +7 (+111 в двоичной)", а ни как не могу понять, от куда эти 111 взялись, понятно что 0111 это 7, но как у них вышло 111 не могу никак дойти до этого момента....
DrGrizzly вне форума Ответить с цитированием
Старый 05.12.2022, 22:30   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от DrGrizzly Посмотреть сообщение
но как у них вышло 111 не могу никак дойти до этого момента....
Запятую в числе перенесли на 7 двоичных разрядов.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.12.2022, 09:04   #5
DrGrizzly
Новичок
Джуниор
 
Регистрация: 05.12.2022
Сообщений: 6
По умолчанию

Вооо! Вот этого понимания мне и не хватало! На 7 бит двигаем запятую и тогда все встает на свои места ))
Спасибо большое!

Получается, что число 100 представляется как 0110 0100, ставим запятую 01,10 0100, это 6 знаков.
127 + 6 = 133 - это значение экспоненты.
В двоичном = 1000 0101
Получаем:
01000010110010000000000000000000

0100 0010 1100 (1000 0000 0000 0000 0000)
4 2 С (8)

Последний раз редактировалось DrGrizzly; 06.12.2022 в 09:18.
DrGrizzly вне форума Ответить с цитированием
Старый 06.12.2022, 11:26   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Да, только вы лихо отбросили значимые нули: 42С80000.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.12.2022, 15:04   #7
DrGrizzly
Новичок
Джуниор
 
Регистрация: 05.12.2022
Сообщений: 6
По умолчанию

Стал экспериментировать с расчетами и опять какая-то магия.
Разложим число 200
В двоичном 1100 1000
Мантисса 1.1001000
Экспонента 134 = 1000 0110
Получаем
0 1000 0110 10010000000000000000000

И тут момент с взятием 8и бит експоненты.
В данном случае это 0100 0011, т.е последний 0 отброшен получается? Или его нельзя отбрасывать?
0100 = 4h
0011 = 3h
10010000000000000000000 = 48 0000h
Результат 43480000h

Если сравнить раскладыванием числа 100, то тут какая-то неувязка...
В двоичном 0110 0100
Экспонента 133 = 1000 0101
Мантисса = 1.100100
И когда соединяем экспоненту с мантиссой что-то с девятым битом не так...
0 1000 0101 10010000000000000000000

9й бит экспоненты должен перейти к мантиссе?

По моим расчетам получилось 42480000, если считать как число 200. Значение мантиссы в десятичном одинаковое(на сайте проверки) у 100 и 200... что собственно страннооо

Проверка расчета

Последний раз редактировалось DrGrizzly; 06.12.2022 в 15:09.
DrGrizzly вне форума Ответить с цитированием
Старый 06.12.2022, 15:14   #8
DrGrizzly
Новичок
Джуниор
 
Регистрация: 05.12.2022
Сообщений: 6
По умолчанию

Пока получился такой код по переводу целого числа в IEEE754

Код:
function IntToBinary(x: integer): string;
var
str: string;
begin
str:='';
while x>1 do
begin
if x mod 2=0 then str:='0'+str else str:='1'+str;
x:=x div 2;
end;
if x=0 then str:='0'+str else str:='1'+str;
Result:=str;
end;

function BinaryToInt(Str: string): String;
var
rez, i: integer;
begin
  rez:=0;
  for i:=1 to length(str) do begin
    rez:=rez shl 1;
    if str[i]='1' then
      rez:=rez or 1;
    end;
result:=IntToStr(rez);
end;

function getFloatHex(float: Integer):String;
var
val1,val2, FirstByte, SecondByte: String ;
mantis, exponBin, binVal, exponVal: String;
x,exponIdx, exponRes: Integer;
begin
//алгоритм с целочисленными положительными
binVal := IntToBinary(float);
exponIdx := length(binVal) - 1;
exponRes := 127 + exponIdx;
exponBin := IntToBinary(exponRes);
if length(exponBin) < 8 then
 exponBin := '0' + exponBin;
delete(binVal, 1,1);
mantis := binVal;
exponVal := '0' + exponBin + mantis;

if length(exponVal) < 32 then
 begin
  for x:=1 to 32 - length(exponVal) do
    exponVal := exponVal + '0';
 end;

for x:=1 to 4 do
  val1 := val1 + exponVal[x];

for x:=5 to 8 do
  val2 := val2 + exponVal[x];

FirstByte := IntToHex(StrToInt(BinaryToInt(val1)), 0) +
              IntToHex(StrToInt(BinaryToInt(val2)), 0);
mantis := '';
for x := 9 to length(exponVal) do
  mantis := mantis + exponVal[x];

SecondByte := IntToHex(StrToInt(BinaryToInt(mantis)), 0);

result := val1+val2+'|'+mantis + '| ' +firstByte + SecondByte;
end;
........

edit2.Text := getFloatHex(StrToInt(Edit1.Text));

Последний раз редактировалось DrGrizzly; 06.12.2022 в 17:13.
DrGrizzly вне форума Ответить с цитированием
Старый 06.12.2022, 15:33   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от DrGrizzly Посмотреть сообщение
Значение мантиссы в десятичном одинаковое(на сайте проверки) у 100 и 200... что собственно страннооо
Ничего странного. Чтобы получить из числа 100 число 200, нужно 100 умножить на 2. Лишняя единичка в экспоненте как раз и дает это умножение.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.12.2022, 17:19   #10
DrGrizzly
Новичок
Джуниор
 
Регистрация: 05.12.2022
Сообщений: 6
По умолчанию

Победил похоже!!!)) Проверил на числах 1, 100, 200, 51, результаты совпадают ) Спасибо большое всем!) Код алгоритма обновил. Осталось только добавить работу с дробными числами и отрицательными, если кому понадобится
DrGrizzly вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Каков диапазон порядка вещественных чисел согласно IEEE 754 Single Precision MyshleninSA Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 07.03.2018 23:24
Сложение чисел IEEE 754 Single. dan332 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 21.04.2017 18:25
IEEE 754 Сложение, вычитание _PROGRAMM_ Помощь студентам 3 27.08.2012 09:03
Дробное число прописью taran1 Microsoft Office Access 7 17.06.2011 15:35
Стандарты IEEE Sam Gold Обсуждение статей 2 10.03.2011 14:16