Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Время преобразования int --> float
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Andy_F
При изучении времени выполнения операций с плавающей точкой (IAR EWAVR 4.30A) выяснилось, что сами операции выполняются относительно быстро (умножение - ~90 тактов, деление - ~90 тактов, логарифм - ~240 тактов...). Но преобразование из int во float занимает чудовищное время - ~1600 тактов. Имеется в виду элементарная операция вида:

Код
int   a;
float b;
...
  b = a;
...


То есть, взяли мы отсчёт АЦП, и для вычисления чего-либо с плавающей точкой, должны сперва потратить 1600 циклов на преобразование. А если отсчёт не один...

Так вот, вопрос, - не существует ли способа ускорить этот процесс ? Рассматривание листинга дизассемблера показало, что в этом месте вызывается функция SL2F, предполагаю - SignedLong2Float. Не существует ли способа "сказать" компилятору, что следует использовать, допустим, SI2F (SignedInt2Float) ?
*antzol*
А если сделать так?
Код
int   a;
float b;
...
  b = (float)a * 1.25;  // какие-то вычисления с отсчетом АЦП
...
Rst7
Чтото неправильно у вас с данными по тактам. Деление никак не 90. Смотрите лучше.

А вообще надо стараться работать только с целыми числами.
Andy_F
Цитата(*antzol* @ Apr 11 2009, 06:28) *
А если сделать так?
Код
int   a;
float b;
...
  b = (float)a * 1.25;  // какие-то вычисления с отсчетом АЦП
...

Нет, от явного приведения типа ничего не меняется.

Цитата(Rst7 @ Apr 11 2009, 09:40) *
Чтото неправильно у вас с данными по тактам. Деление никак не 90. Смотрите лучше.

Спорить про деление не буду, не оно меня в данном случае интересует.

Цитата(Rst7 @ Apr 11 2009, 09:40) *
А вообще надо стараться работать только с целыми числами.

Большинство функций модуля math работают именно с плавающей точкой. Хотелось бы пользоваться готовой библиотекой, а не "изобретать велосипед". А здесь такая беда...
Rst7
Цитата
Хотелось бы пользоваться готовой библиотекой, а не "изобретать велосипед".


А придется. Иначе Вам в соседние ветки - ARM, MIPS, PPC - выбираете по возрастанию производительности и цены, прямо коррелирующие с количеством "готовых библиотек". Дабы не слыть флудерастом скажу - выкладывайте свою математику, поможем Вам сделать ее целочисленной.

Цитата
Спорить про деление не буду, не оно меня в данном случае интересует.


Это был намек wink.gif Подумайте, какие операции надо выполнить процессору при преобразовании int->float. Намекаю более конкретно - пока старший бит не равен 1 сдвигаем влево, заодно увеличивая дополнительный счетчик (знак можно обработать отдельно). После выполнения этого цикла результат сдвига - суть мантиса, счетчик - суть порядок. Ну плюс еще туда-сюда данные приготовить. Итого - мизер, а никак не 1600 тактов. Это нормальное число для деления, но не для преобразования типов. Надо бы Вам еще внимательно покурить теорию работы с float'ами, а потом уже браться за проект.
Andy_F
Цитата(Rst7 @ Apr 11 2009, 14:10) *
Надо бы Вам еще внимательно покурить теорию работы с float'ами, а потом уже браться за проект.

smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.