Перейти к содержанию
    

Как в микроконтроллере преобразовать число float IEEE 754 в десятичное int?

Добрый день есть устройство, которое передает в микроконтроллер значения в виде float_32 IEEE 754

Например -12.5 это будет 0xC148 0000 Мне в микроконтроллере данное число нужно как -125; Пробовал преобразовать как:

int32_t a;

float *b;

b=(float*) &a

return *b * 10;

Все нормально получаю -125. Но в микроконтроллере нет аппаратной поддержки float, и всё это преобразование занимает 6 мкс. Хотелось бы конечно быстрее. В связи с этим возник вопрос можно ли это преобразования сделать как-то по другому? Желательно с помощью сдвигов и циклов целочисленных.

Я попробовал получить отдельно: знак, мантиссу и экспоненту – все правильно, но как все это склеить в число не совсем понятно:

    sign = (1-2*(number>>31));

    printf("%d\n", sign);

 

    exponenta = ((number<<1)>>24)-127;

    printf("%d\n", exponenta);

 

    mantissa = (number<<9)>>9;

    printf("%d\n", mantissa);

Может есть возможность перехода от числа с плавающей точкой к числу с фиксированной точкой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, sidy сказал:

Все нормально получаю -125. Но в микроконтроллере нет аппаратной поддержки float, и всё это преобразование занимает 6 мкс. Хотелось бы конечно быстрее. В связи с этим возник вопрос можно ли это преобразования сделать как-то по другому? Желательно с помощью сдвигов и циклов целочисленных.

Какой у вас CPU - предлагаете угадывать?

Если ARM, то возможно чуть быстрее будет, если сперва преобразовать с умножением на степень двойки, а потом делать умножение на 10.

типа: 

float a = ...;
int result = (int)(a * (1 << 8)) * 10 >> 8;

Но не факт, что быстрее. Может оказаться так же. Зависит от конкретной реализации стандартной библиотеки эмуляции float в вашем компиляторе, и от его способностей по оптимизации.

Конкретные значения величины сдвига зависят от диапазона значений (который вы также не удосужились указать). А также - от ядра.

 

3 часа назад, sidy сказал:

Может есть возможность перехода от числа с плавающей точкой к числу с фиксированной точкой?

Вы надеетесь переписать стандартную библиотеку поддержки float оптимальнее, чем разработчики компилятора? Толком не умея даже программировать? ну-ну...  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, sidy сказал:

к числу с фиксированной точкой?

К целому числу. Поскольку фиксированная точка - это отдельное и фиксированное число разрядов для дробной части. 
 

Тут надо смотреть, как в этом стандарте вообще представлены числа

slide-45.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/19/2023 at 2:59 PM, sidy said:

Добрый день есть устройство, которое передает в микроконтроллер значения в виде float_32 IEEE 754

А диапазон, передаваемых значений умноженный на 10, уложится в int ?

А при умножении передаваемого значения на 10 переполнения не возникнет ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, dimka76 said:

А диапазон, передаваемых значений умноженный на 10, уложится в int ?

А при умножении передаваемого значения на 10 переполнения не возникнет ?

Если в десятичном виде, то уложиться (от - 80 до 200) или если умножить на 10 (чтобы иметь 1 знак после запятой) от -800 до 2000.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё быстрее может быть умножить на 2, потом ещё на 4 и эти два числа сложить. Умножение на 2 = инкремент экспоненты, один-два такта процессора.
А преобразование из плавающей запятой в целое намного дольше.

Я бы написал в лоб и посмотрел код, который генерит компилятор в разных режимах оптимизации. Если там всё глухо - на каждое действие вызов библиотеки эмуляции, тогда да, стоит писать руками критическое.

Изменено пользователем vov4ick

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/19/2023 at 9:47 PM, vov4ick said:

Умножение на 2 = инкремент экспоненты, один-два такта процессора.

А компилятор до этого додумается ?
Или в рукопашную ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, vov4ick сказал:

Ещё быстрее может быть умножить на 2, потом ещё на 4 и эти два числа сложить.

Не быстрее. Сложение двух floating point с программной эмуляцией будет явно медленнее простого целочисленнго умножения (которое имеется в этом МК).

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

 

PS: Самый оптимальный способ - это переделать то устройство, "которое передает в микроконтроллер значения в виде float_32 IEEE 754". Чтобы оно передавало fixed point value.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/19/2023 at 9:58 PM, jcxz said:

PS: Самый оптимальный способ - это переделать то устройство, "которое передает в микроконтроллер значения в виде float_32 IEEE 754". Чтобы оно передавало fixed point value.

А если это покупное устройство ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А сколько времени занимает ftoi и потом ваша математика?

Если узкое место - именно дробное сложение - сделать умножение на 8 или 16, потом ftoi, а множитель учесть потом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разве компилятор не сделает за вас быстрее преобразование из float в int?
Проблема в умножении на 10?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проц у ТСа серьёзный - 16 бит, делит-умножает аппаратно...
Рискну посоветовать книжицу: Злобин, Григорьев "Программирование арифметических операций в микроконтроллерах" 1991

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, vov4ick сказал:

А сколько времени занимает ftoi и потом ваша математика?

Всяко меньше, чем ваша плавающая математика + ftoi затем.

8 часов назад, vov4ick сказал:

Если узкое место - именно дробное сложение - сделать умножение на 8 или 16, потом ftoi, а множитель учесть потом.

Если вы поднимите глаза чуть выше, то заметите, что подобное я предложил ещё в самом первом сообщении (только естественно не с множителем 8, которого явно недостаточно).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...