sidy 1 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба Добрый день есть устройство, которое передает в микроконтроллер значения в виде 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); Может есть возможность перехода от числа с плавающей точкой к числу с фиксированной точкой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба 3 часа назад, sidy сказал: Все нормально получаю -125. Но в микроконтроллере нет аппаратной поддержки float, и всё это преобразование занимает 6 мкс. Хотелось бы конечно быстрее. В связи с этим возник вопрос можно ли это преобразования сделать как-то по другому? Желательно с помощью сдвигов и циклов целочисленных. Какой у вас CPU - предлагаете угадывать? Если ARM, то возможно чуть быстрее будет, если сперва преобразовать с умножением на степень двойки, а потом делать умножение на 10. типа: float a = ...; int result = (int)(a * (1 << 8)) * 10 >> 8; Но не факт, что быстрее. Может оказаться так же. Зависит от конкретной реализации стандартной библиотеки эмуляции float в вашем компиляторе, и от его способностей по оптимизации. Конкретные значения величины сдвига зависят от диапазона значений (который вы также не удосужились указать). А также - от ядра. 3 часа назад, sidy сказал: Может есть возможность перехода от числа с плавающей точкой к числу с фиксированной точкой? Вы надеетесь переписать стандартную библиотеку поддержки float оптимальнее, чем разработчики компилятора? Толком не умея даже программировать? ну-ну... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба 3 часа назад, sidy сказал: к числу с фиксированной точкой? К целому числу. Поскольку фиксированная точка - это отдельное и фиксированное число разрядов для дробной части. Тут надо смотреть, как в этом стандарте вообще представлены числа Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба 2 hours ago, jcxz said: Какой у вас CPU - предлагаете угадывать? PIC24HJ128GP506 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба On 12/19/2023 at 2:59 PM, sidy said: Добрый день есть устройство, которое передает в микроконтроллер значения в виде float_32 IEEE 754 А диапазон, передаваемых значений умноженный на 10, уложится в int ? А при умножении передаваемого значения на 10 переполнения не возникнет ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба 19 minutes ago, dimka76 said: А диапазон, передаваемых значений умноженный на 10, уложится в int ? А при умножении передаваемого значения на 10 переполнения не возникнет ? Если в десятичном виде, то уложиться (от - 80 до 200) или если умножить на 10 (чтобы иметь 1 знак после запятой) от -800 до 2000. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 35 19 декабря, 2023 Опубликовано 19 декабря, 2023 (изменено) · Жалоба Ещё быстрее может быть умножить на 2, потом ещё на 4 и эти два числа сложить. Умножение на 2 = инкремент экспоненты, один-два такта процессора. А преобразование из плавающей запятой в целое намного дольше. Я бы написал в лоб и посмотрел код, который генерит компилятор в разных режимах оптимизации. Если там всё глухо - на каждое действие вызов библиотеки эмуляции, тогда да, стоит писать руками критическое. Изменено 19 декабря, 2023 пользователем vov4ick Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба On 12/19/2023 at 9:47 PM, vov4ick said: Умножение на 2 = инкремент экспоненты, один-два такта процессора. А компилятор до этого додумается ? Или в рукопашную ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба 11 минут назад, vov4ick сказал: Ещё быстрее может быть умножить на 2, потом ещё на 4 и эти два числа сложить. Не быстрее. Сложение двух floating point с программной эмуляцией будет явно медленнее простого целочисленнго умножения (которое имеется в этом МК). Если хотите сдвигать-складывать вместо умножения, то делайте это с целочисленным значением (после преобразования в int). PS: Самый оптимальный способ - это переделать то устройство, "которое передает в микроконтроллер значения в виде float_32 IEEE 754". Чтобы оно передавало fixed point value. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба On 12/19/2023 at 9:58 PM, jcxz said: PS: Самый оптимальный способ - это переделать то устройство, "которое передает в микроконтроллер значения в виде float_32 IEEE 754". Чтобы оно передавало fixed point value. А если это покупное устройство ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sidy 1 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба 9 minutes ago, dimka76 said: А если это покупное устройство ? Да, это покупное устройство. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 35 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба А сколько времени занимает ftoi и потом ваша математика? Если узкое место - именно дробное сложение - сделать умножение на 8 или 16, потом ftoi, а множитель учесть потом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pyroman 2 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба Разве компилятор не сделает за вас быстрее преобразование из float в int? Проблема в умножении на 10? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 19 декабря, 2023 Опубликовано 19 декабря, 2023 · Жалоба Проц у ТСа серьёзный - 16 бит, делит-умножает аппаратно... Рискну посоветовать книжицу: Злобин, Григорьев "Программирование арифметических операций в микроконтроллерах" 1991 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 20 декабря, 2023 Опубликовано 20 декабря, 2023 · Жалоба 8 часов назад, vov4ick сказал: А сколько времени занимает ftoi и потом ваша математика? Всяко меньше, чем ваша плавающая математика + ftoi затем. 8 часов назад, vov4ick сказал: Если узкое место - именно дробное сложение - сделать умножение на 8 или 16, потом ftoi, а множитель учесть потом. Если вы поднимите глаза чуть выше, то заметите, что подобное я предложил ещё в самом первом сообщении (только естественно не с множителем 8, которого явно недостаточно). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться