Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить

HEX float to DEC

Пн янв 11, 2021 18:23:36

Есть число float ( например 040C2240 )
нужно его перевести в десятичный вид
Подскажите пжлст как это сделать?

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

Re: HEX float to DEC

Пн янв 11, 2021 19:02:52

Допустим речь у вас о 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

Меня больше интересует алгоритм, чем результат.
А чем в алгоритме можно пользоваться? Плавающей арифметикой можно? Если да, то метод умножения на 10 должен помочь. Весьма простой алгоритм для начала.

Re: HEX float to DEC

Вт янв 12, 2021 00:05:09

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

Спасибо :beer:
Мне нужно было понять, каким стандартом нужно пользоваться... Раньше не сталкивался..
Возьму на вооружение IEEE754.

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

Ну я пока на бумажке считаю. Писать буду на асме, скорей всего....
Все зависит от микроконтроллера.. На stm32f407 можно и аппаратно этим заниматься. Вот: http://stm32asm.ru/407/f407_fpu.html

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

Да их много. Я его видел, но что то не разобрался с ним...
Спасибо, объяснили.. :beer:
Я другим воспользовался - более понятным: http://floatingpoint.ru/online/float2dec.php


А чем в алгоритме можно пользоваться? Плавающей арифметикой можно?
Если да, то метод умножения на 10 должен помочь. Весьма простой алгоритм для начала.

Спасибо, вопрос больше имел теоретический характер, чем практический.
Вот тут то что нужно мне было.. https://ru.wikipedia.org/wiki/%D0%A7%D0 ... 1%82%D0%B8

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

Re: HEX float to DEC

Вт янв 12, 2021 09:20:31

Все зависит от микроконтроллера..

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

Re: HEX float to DEC

Вт янв 12, 2021 21:27:19

возможно Вам требуются следующие операции:

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

Немного покопавшись выяснил, что нужный результат дает следующий калькулятор:
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

Может эта статья будет полезна в плане алгоритмов.

Re: HEX float to DEC

Сб янв 16, 2021 05:57:35

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

Re: HEX float to DEC

Сб янв 16, 2021 10:27:47

uwrtey, а почему вы решили, что калькулятор врет? Я бегло смотрел, вроде всё правильно показывал.

Re: HEX float to DEC

Сб янв 16, 2021 12:07:40

Странно. Сейчас проверил и вправду нормальный калькулятор.. Прошу прощения - наговариваю на него..
Видимо я где то затупил...
Ответить