Страница 1 из 1

HEX float to DEC

Добавлено: Пн янв 11, 2021 18:23:36
uwrtey
Есть число float ( например 040C2240 )
нужно его перевести в десятичный вид
Подскажите пжлст как это сделать?

Меня больше интересует алгоритм, чем результат.
Заранее благодарен.

Re: HEX float to DEC

Добавлено: Пн янв 11, 2021 19:02:52
NStorm
Допустим речь у вас о IEEE 754. Прежде чем лезть в алгоритмы, нужно прочитать краткую теорию: https://ru.wikipedia.org/wiki/%D0%A7%D0 ... 1%82%D0%B8

Там и примеры есть. А алгоритм будет от языка зависеть, но для питона скажем там есть пример, можно по нему прикинуть так сказать.

Есть наглядный калькулятор онлайн: https://www.h-schmidt.net/FloatConverter/IEEE754.html
В последнее поле вводите ваше 0x040c2240 и видите раскладку вашего числа и его десятичное представление.

Re: HEX float to DEC

Добавлено: Пн янв 11, 2021 23:01:52
B@R5uk
[uquote="uwrtey",url="/forum/viewtopic.php?p=3957739#p3957739"]Меня больше интересует алгоритм, чем результат.[/uquote] А чем в алгоритме можно пользоваться? Плавающей арифметикой можно? Если да, то метод умножения на 10 должен помочь. Весьма простой алгоритм для начала.

Re: HEX float to DEC

Добавлено: Вт янв 12, 2021 00:05:09
uwrtey
[uquote="NStorm",url="/forum/viewtopic.php?p=3957774#p3957774"]Допустим речь у вас о IEEE 754. Прежде чем лезть в алгоритмы, нужно прочитать краткую теорию: https://ru.wikipedia.org/wiki/%D0%A7%D0 ... 1%82%D0%B8[/uquote]
Спасибо :beer:
Мне нужно было понять, каким стандартом нужно пользоваться... Раньше не сталкивался..
Возьму на вооружение IEEE754.

[uquote="NStorm",url="/forum/viewtopic.php?p=3957774#p3957774"]Там и примеры есть. А алгоритм будет от языка зависеть, но для питона скажем там есть пример, можно по нему прикинуть так сказать.[/uquote]
Ну я пока на бумажке считаю. Писать буду на асме, скорей всего....
Все зависит от микроконтроллера.. На stm32f407 можно и аппаратно этим заниматься. Вот: http://stm32asm.ru/407/f407_fpu.html

[uquote="NStorm",url="/forum/viewtopic.php?p=3957774#p3957774"]Есть наглядный калькулятор онлайн: https://www.h-schmidt.net/FloatConverter/IEEE754.html
В последнее поле вводите ваше 0x040c2240 и видите раскладку вашего числа и его десятичное представление.[/uquote]
Да их много. Я его видел, но что то не разобрался с ним...
Спасибо, объяснили.. :beer:
Я другим воспользовался - более понятным: http://floatingpoint.ru/online/float2dec.php


[uquote="B@R5uk",url="/forum/viewtopic.php?p=3957933#p3957933"]А чем в алгоритме можно пользоваться? Плавающей арифметикой можно?
Если да, то метод умножения на 10 должен помочь. Весьма простой алгоритм для начала.[/uquote]
Спасибо, вопрос больше имел теоретический характер, чем практический.
Вот тут то что нужно мне было.. https://ru.wikipedia.org/wiki/%D0%A7%D0 ... 1%82%D0%B8

В коде пока не думал как это сделать - рановато.
Нужно понять, те ли данные я вырвал из потока. :shock:
// Читаю поток данных. Выдергиваю, интересующие меня, пакеты. В этих пакетах несколько параметров... Возможно это совсем не те пакеты, так как расшифрованные параметры отличаются от истины...

Re: HEX float to DEC

Добавлено: Вт янв 12, 2021 09:20:31
NStorm
Все зависит от микроконтроллера..
От языка больше. Даже где контроллер не умеет аппаратные плавающие запятые, языки высокого уровня позволяют работать с float. На Си это нативно делается, не важно есть FPU или нет. Без FPU просто подключается библиотека программной эмуляции, которая ес-но отжирает место и ресурсы, но позволяет использовать float как родной без проблем.

Re: HEX float to DEC

Добавлено: Вт янв 12, 2021 21:27:19
ddr4
возможно Вам требуются следующие операции:

packFloat() - пакуем float в 4 байта.
unpackFloat() - распаковываем float из 4 байтов.

Код: Выделить всё

void packFloat(void *buf, float x) {
    unsigned char *b = (unsigned char *)buf;
    unsigned char *p = (unsigned char *) &x;
#if defined (_M_IX86) || (defined (CPU_FAMILY) && (CPU_FAMILY == I80X86))
    b[0] = p[3];
    b[1] = p[2];
    b[2] = p[1];
    b[3] = p[0];
#else
    b[0] = p[0];
    b[1] = p[1];
    b[2] = p[2];
    b[3] = p[3];
#endif
}

Код: Выделить всё

float unpackFloat(const void *buf) {
    const unsigned char *b = (const unsigned char *)buf;
    uint32_t temp = 0;
    temp = ((b[0] << 24) |
            (b[1] << 16) |
            (b[2] <<  8) |
             b[3]);
    return *((float *) &temp);
}
Взято отсюда (и немного изменено):
https://stackoverflow.com/questions/399 ... site-bytes

Re: HEX float to DEC

Добавлено: Сб янв 16, 2021 03:18:10
uwrtey
Немного покопавшись выяснил, что нужный результат дает следующий калькулятор:
https://www.scadacore.com/tools/program ... -converter
например float BD10F575 = (-0.0353903361)
Видимо нужна реализация Float - Big Endian (ABCD)
Остальные калькуляторы нужного результата не давали.

Буду признателен, если научите рассчитывать данный результат на бумажке.
( конструкции на высоко-уровневых языках прошу не предлагать. хочу понять как реализовать математику.)
Хочу подпрограмму данного расчета организовать на ассемблере AVR.

В двойне буду признателен, если у кого есть готовая реализация. :beer:

Re: HEX float to DEC

Добавлено: Сб янв 16, 2021 03:30:19
Ser60
Может эта статья будет полезна в плане алгоритмов.

Re: HEX float to DEC

Добавлено: Сб янв 16, 2021 05:57:35
uwrtey
Разобрался.
Ровно как в вики описано: https://ru.wikipedia.org/wiki/%D0%A7%D0 ... 1%82%D0%B8
Теперь на бумажке считать умею..
Осталось в коде реализовать.

Re: HEX float to DEC

Добавлено: Сб янв 16, 2021 10:27:47
NStorm
uwrtey, а почему вы решили, что калькулятор врет? Я бегло смотрел, вроде всё правильно показывал.

Re: HEX float to DEC

Добавлено: Сб янв 16, 2021 12:07:40
uwrtey
Странно. Сейчас проверил и вправду нормальный калькулятор.. Прошу прощения - наговариваю на него..
Видимо я где то затупил...