|
|
  |
Математика с float на Cortex-M3. |
|
|
|
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 доступных). Предложите свой вариант решения? И оцените, сколько это потребует времени, и какая сложность реализации по сравнению с этим решением "в лоб"?
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|