|
Математика с float на Cortex-M3. |
|
|
|
Sep 1 2015, 12:05
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 13-09-12
Пользователь №: 73 530

|
Если есть FPU, то умножать быстрее будет, иначе точно не скажешь - нужно тестировать.
|
|
|
|
|
Sep 1 2015, 13:44
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Sep 1 2015, 15:22)  да. забыл уточнить. делю флоат на инт. А в первом сообщении Цитата Если я заменю (100/3.5) на (100 * 0.286) все наоборот озвучивалось. Скорее всего, имеет место быть "преждевременная оптимизация", а это, как известно, зло)) Без "махинаций" не работает?
|
|
|
|
|
Sep 1 2015, 14:06
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (adnega @ Sep 1 2015, 16:44)  Скорее всего, имеет место быть "преждевременная оптимизация", а это, как известно, зло)) Часто слышу эту глупость  , когда услышав звон, не поняли о чем он  QUOTE Без "махинаций" не работает? Не худо бы для начала выяснить, что на "не работает" вообще никто не жалуется.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 1 2015, 14:51
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(zltigo @ Sep 1 2015, 17:06)  Часто слышу эту глупость  , когда услышав звон, не поняли о чем он  Не худо бы для начала выяснить, что на "не работает" вообще никто не жалуется. А хамить не нужно)) На вопрос Цитата повлияет это на размер/скорость кода? или компилятор сам автоматически оптимизирует математические операции? отвечу "повлияет на размер и скорость выполнения; компилятор не умеет оптимизировать математику, не имея дополнительной информации о переменных". Такого ответа желал услышать ТС? В чем смысл созданной темы в ветке "ARM"? Просто поболтать, или насущная необходимость в оптимизации появилась? Я поспешно предположил второе. Если вы тут просто пообщаться собрались, то прошу прощения, что влез, а власть имущих прошу перенести тему в соответствующий раздел) Если хотите, чтобы с вами поделились опытом в вопросе "грамотной перестановки слагаемых", то задавайте конкретный вопрос, чтоб проблематика была понятна, а обмусоливать такты и байты... не в "ARM,32"
|
|
|
|
|
Sep 1 2015, 15:26
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(adnega @ Sep 1 2015, 19:51)  А хамить не нужно))
На вопрос
отвечу "повлияет на размер и скорость выполнения; компилятор не умеет оптимизировать математику, не имея дополнительной информации о переменных".
Такого ответа желал услышать ТС? В чем смысл созданной темы в ветке "ARM"? Просто поболтать, или насущная необходимость в оптимизации появилась? Я поспешно предположил второе. Если вы тут просто пообщаться собрались, то прошу прощения, что влез, а власть имущих прошу перенести тему в соответствующий раздел)
Если хотите, чтобы с вами поделились опытом в вопросе "грамотной перестановки слагаемых", то задавайте конкретный вопрос, чтоб проблематика была понятна, а обмусоливать такты и байты... не в "ARM,32" все работает. все делиться и результаты правильные. просто прибор работает на батарейке и я пытаюсь сэкономить на всем. вот я и решил заменить деление умножением. может сэкономлю кванты энергии которые в конечном счете помогут продлить жизнь батарейке.
|
|
|
|
|
Sep 1 2015, 16:24
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Sep 1 2015, 18:26)  помогут продлить жизнь батарейке. Тут все еще сложнее) Что выгоднее: понижать тактовую CPU или увеличивать ее (с учетом возможности сна)? Или разница не значительна? Мне кажется, чем больше частота и чем больше транзисторов переключается, тем выше потребление. Можно провести эксперимент: x*y и x/y запустить миллион таких операций и замерить произведение времени выполнения на потребляемый ток. Затем сравнить два этих числа и сделать вывод на сколько процентов отличается. Пробовали?
|
|
|
|
|
Sep 1 2015, 18:04
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ЯadiatoR @ Sep 1 2015, 20:54)  А разве препроцессор обрабатывает float значения? Я про float не горовил, но в свое время пользовался так Код #define Vc (1430.0) //!< Напряжение при V25, мВ. #define Ta (4.3) //!< Крутизна преобразования, мВ/C. #define Tb (25.0) //!< Температура V25, C.
#define TCPU_MIN (-40.0) //!< Нижняя температура, C. #define TCPU_MAX (85.0) //!< Верхняя температура, C. #define TCPU_HYST (5.0) //!< Гистерезис температуры, C.
#define TCPU(T) (Vc - Ta * ((T) - Tb))
#define TCPU_COLD ((int)(TCPU(TCPU_MIN))) #define TCPU_HOT ((int)(TCPU(TCPU_MAX))) #define TCPU_NORMAL_MIN ((int)(TCPU(TCPU_MIN + TCPU_HYST))) #define TCPU_NORMAL_MAX ((int)(TCPU(TCPU_MAX - TCPU_HYST))) и имел TCPU_COLD, TCPU_HOT, TCPU_NORMAL_MIN, TCPU_NORMAL_MAX в виде int-овых констант.
|
|
|
|
|
Sep 2 2015, 02:24
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ЯadiatoR @ Sep 1 2015, 23:54)  А разве препроцессор обрабатывает float значения? Препроцессор не обрабатывает ни флоат ни инт (за исключением вычисления значения выражения внутри #if). Он выполняет текстовую подстановку. Сто раз уже это здесь говорили за последнее время.
|
|
|
|
|
Sep 2 2015, 05:42
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(adnega @ Sep 1 2015, 21:04)  Я про float не горовил, но в свое время пользовался так ... и имел TCPU_COLD, TCPU_HOT, TCPU_NORMAL_MIN, TCPU_NORMAL_MAX в виде int-овых констант. Поясните, пожалуйста, программа работала с float (или даже с double), и только результат приводила к int? Как-то тяжеловато. Или сам компилятор всё вычислял? То есть, в #define можно смело пользоваться числами с плавающей запятой?
|
|
|
|
|
Sep 2 2015, 05:58
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ViKo @ Sep 2 2015, 08:42)  Поясните, пожалуйста, программа работала с float (или даже с double), и только результат приводила к int? Как-то тяжеловато. Или сам компилятор всё вычислял? То есть, в #define можно смело пользоваться числами с плавающей запятой? Программа работала только с целыми числами. По сути, показания с АЦП без какой-либо обработки сравнивались с константами для получения событий выхода встроенного датчика температуры из диапазона. Если честно переводить показания АЦП в температуру, а потом сравнивать с порогами, то пришлось бы незаурядно выкручиваться в целых числах. Но определив несколько define-ов, можно добиться того, что компилятор сам все рассчитает и в нужные места подставит константы. Как справедливо было замечено, не препроцессор, а именно компилятор.
|
|
|
|
|
Sep 2 2015, 08:29
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ViKo @ Sep 2 2015, 10:47)  Еще раз спрошу. Компилятор посчитал числа с плавающей запятой?  Видимо: Код if(value < TCPU_HOT) 8002b9e: f240 4293 movw r2, #1171; 0x493 8002ba2: 4290 cmp r0, r2 8002ba4: dd08 ble.n 8002bb8 <sh_a_value+0x194> Vc - Ta * ((T) - Tb) = 1430.0 - 4.3 * (85.0 - 25.0) = 1172
|
|
|
|
|
Sep 2 2015, 11:29
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(ViKo @ Sep 2 2015, 11:59)  Конкретнее никак нельзя?  Ээээ.. поясняю... 1. открываем интернет-бравзер. 2. пытаемся найти там адресную строку. 3. кликаем тура мышой 4. ищем клавиатуру. 5. нажимаем следующие кнопки: w,w,w,.g,o,o,g,l,e,.,c,o,m, <enter> 6. делаем еще мозговое усилие и ищем строку ввода поискового запроса. 5. повторяем пункты 3 и 4 6. вводим ключевые слова, как подробно описано в пункте 5. 7. смотрим на экран 8. пытаемся найти там результаты поиска. 9. читаем.. Еще конкретнее ?
|
|
|
|
|
Oct 21 2015, 13:14
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
При компиляции с оптимизацией компилятор считает константные выражения и заменяет их сразу на результат. int a = 100 * 0.5; будет заменено на загрузку в a значения 50 и эмуляция плавучки не будет линковаться к проекту. Такое можно делать даже на AVR. Понятно, что любые составляющие этого константного выражения могут быть #define'ами т.к. препроцессинг это просто подстановка текста. Вычисляются выражения на этапе компиляции по тем-же правилам как и в рантайме(т.е. со всеми приколами integer promotion, приведениями типов и т.д.) На практике я видел как даже функции из math.h с константными и известными на этапе компиляции аргументами часто считаются компилятором и в рантайме не вызываются. К приммеру можете попробовать сделать int a = round(1.5); и посмотреть дизасм Цитата Думал, дробная часть в любых числах при компиляции отбрасывается. Как мне когда-то тут сказали: последнюю версию компилятора поставить может каждый...но надо иногда и книжки по Си читать )))))
--------------------
The truth is out there...
|
|
|
|
|
Oct 21 2015, 13:31
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(sigmaN @ Oct 21 2015, 16:14)  Как мне когда-то тут сказали: последнюю версию компилятора поставить может каждый...но надо иногда и книжки по Си читать ))))) Выходит, компилятор внутре себя имеет неенку полноценный вычислитель всех стандартных C функций? И ему даже не надо указывать "подгрузить" заголовочные файлы "math.h"? А float d = sin(M_PI / 8); тоже вычислит? Были бы хорошие книжки, почитал бы еще, и с удовольствием. Но они баснословно дорого стоят. А в электронном виде - это эрзац-книжки.
|
|
|
|
|
Oct 21 2015, 16:47
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата Выходит, компилятор внутре себя имеет неенку полноценный вычислитель всех стандартных C функций? А float d = sin(M_PI / 8); тоже вычислит? На сколько я знаю, замена функций результатами - поведение не требуемое стандартом. Это я из практики просто знаю. Просто скомпилируйте и посмотрите, должен и sin() оптимизировать. Цитата И не забываем следить стоит ли литера f на конце floatpoint констант. Это сильно влияет на скорость. Впрочем как и на точность ) И вообще я никогда не использую вычисления с плавающей точкой на процессорах без ее аппаратной поддержки. Такие трюки со свёрткой константных выражений хорошо подходят для того чтобы что-то посчиталось с плавающей точкой во время компиляции но на выходе дало int. Если допустить появление плавучки в рантайме - к проекту сразу прилинкуется библиотека эмуляции. Не самая быстрая в любом случае. Так что надо один раз и на всегда освоить fixed point math или использовать процы с аппаратной поддержкой плавучки. P.S. В этом плане С++ с его перегрузкой операторов позволяет писать очень естественный и удобочитаемый код даже при вычислениях с фикс. точкой.. Лично я в начале этого года плотно пересел на плюсы и реализовал свою библиотеку. С фишками С++11 всё что возможно в ней тоже считается на этапе компиляции и я очень доволен! Си теперь кажется чем-то доисторическим))))))
--------------------
The truth is out there...
|
|
|
|
|
Oct 22 2015, 10:56
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (sigmaN @ Oct 21 2015, 22:47)  Если допустить появление плавучки в рантайме - к проекту сразу прилинкуется библиотека эмуляции. Не самая быстрая в любом случае. И что, если это решает задачу? QUOTE (sigmaN @ Oct 21 2015, 22:47)  Так что надо один раз и на всегда освоить fixed point math или использовать процы с аппаратной поддержкой плавучки. Гуд. Вот реальная задача (не выдуманная). Есть некий прибор, который по нажатию кнопки пользователем должен среди всего прочего вычислить некое значение из входного параметра и вывести на индикатор, т.е. время реакции - до 100 мс, чтобы не вызывать дискомфорт. Алгоритм вычисления - простой полином 3-го порядка: y = a3*x^3 + a2*x^2 + a1*x + a0 коэффициенты: a0 = 0.00244813186608 a1 = -2.23013987646e-005 a2 = 4.76311678518e-008 a3 = -6.46053293535e-012 На AVR о 8-ми мегагерцах тактовой оный полином вычисляется за время около 6 или 8 (не помню точно) мс. Плавучка тянет где-то полтора кБ кода. Задача решена (общий размер прошивки ~5 кБ из 8 доступных). Предложите свой вариант решения? И оцените, сколько это потребует времени, и какая сложность реализации по сравнению с этим решением "в лоб"?
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 23 2015, 07:22
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (blackfin @ Oct 22 2015, 17:08)  Использовать Схему Горнера? Угу, она, родимая, и использовалась: CODE float P5x(const TtCoeffs* const p, const float x) { return ((((p->a5*x + p->a4)*x + p->a3)*x + p->a2)*x + p->a1)*x + p->a0; } QUOTE (blackfin @ Oct 22 2015, 17:08)  /Шутка, если што../
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|