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

Время преобразования int --> float

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

 

int   a;
float b;
...
  b = a;
...

 

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

 

Так вот, вопрос, - не существует ли способа ускорить этот процесс ? Рассматривание листинга дизассемблера показало, что в этом месте вызывается функция SL2F, предполагаю - SignedLong2Float. Не существует ли способа "сказать" компилятору, что следует использовать, допустим, SI2F (SignedInt2Float) ?

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


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

А если сделать так?

int   a;
float b;
...
  b = (float)a * 1.25;  // какие-то вычисления с отсчетом АЦП
...

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

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


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

Чтото неправильно у вас с данными по тактам. Деление никак не 90. Смотрите лучше.

 

А вообще надо стараться работать только с целыми числами.

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


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

А если сделать так?

int   a;
float b;
...
  b = (float)a * 1.25;  // какие-то вычисления с отсчетом АЦП
...

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

 

Чтото неправильно у вас с данными по тактам. Деление никак не 90. Смотрите лучше.

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

 

А вообще надо стараться работать только с целыми числами.

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

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


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

Хотелось бы пользоваться готовой библиотекой, а не "изобретать велосипед".

 

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

 

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

 

Это был намек ;) Подумайте, какие операции надо выполнить процессору при преобразовании int->float. Намекаю более конкретно - пока старший бит не равен 1 сдвигаем влево, заодно увеличивая дополнительный счетчик (знак можно обработать отдельно). После выполнения этого цикла результат сдвига - суть мантиса, счетчик - суть порядок. Ну плюс еще туда-сюда данные приготовить. Итого - мизер, а никак не 1600 тактов. Это нормальное число для деления, но не для преобразования типов. Надо бы Вам еще внимательно покурить теорию работы с float'ами, а потом уже браться за проект.

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


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

Надо бы Вам еще внимательно покурить теорию работы с float'ами, а потом уже браться за проект.

:)

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


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

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

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

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

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

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

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

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

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

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