Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибк при передаче значений переменной в функцию
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Vladimir_T
Здравствуйте, подскажите, пожалуйста... Странная ситуация, не должно быть так, но у меня то есть....
Мне нужно быстро вычислять значения функции синус, для чего стал использовать разложение в степенной ряд,
первым членом ограничился. Стал отлаживать, а функция постоянно мне выдает бесконечно малую величину, стал смотреть отладчиком в Кейле 5.4, в самой функции и вижу, что в функцию постоянно передается значение
X = 1.084202e-019, тогда, как передаются значения от 0 до pi/4. Никаких вложенных прерываний, чтобы стек нарушался - нет. Где моя ошибка? Подскажите, пожалуйста!

Код
#define  Factr_3  0.0556

float Rough_Sinus (float X)
{float Ret = X - X*X*X / Factr_3;
return Ret;
}
Golikov A.
надеюсь вы знаете что это разложение вблизи нуля, и по мере отхождения от него ошибка будет расти.
второй момент это отладчик KEIL, для того чтобы его использовать надо поставить оптимизацию проекта на 0, не на default, а именно на 0, потому что дефалт у него -2.
ну и третья ошибка, 3! == 6

sin x = x - x^3 / 3! + x^5 / 5!... -ряд Маклорена
и вы надеюсь помните что X в радианах
adnega
Цитата(Golikov A. @ Apr 26 2014, 09:06) *
надеюсь вы знаете что это разложение вблизи нуля, и по мере отхождения от него ошибка будет расти.
второй момент это отладчик KEIL, для того чтобы его использовать надо поставить оптимизацию проекта на 0, не на default, а именно на 0, потому что дефалт у него -2.
ну и третья ошибка, 3! == 6

sin x = x - x^3 / 3! + x^5 / 5!... -ряд Маклорена
и вы надеюсь помните что X в радианах

3! = 6.0f
Vladimir_T
Спасибо, оптимизация включена по умолчанию, поставлю нулевую и проверю!
Степень я не делю, а домножаю на коэффициент.
Да, с коэффициентом я ошибся: нужно 1/3! = 0.166667, а я взял 1/3*3! = 0.0556.
Т.е. вместо деления, делаю умножение на обратную величину. С элементарной математикой здесь нет ошибки, я проверил все на ПК, точность для меня приемлема. А нв АРМе 966 не идет.
aaarrr
Проверьте еще, на месте ли прототип вызываемой функции.
Golikov A.
Цитата(Vladimir_T @ Apr 26 2014, 17:02) *
Спасибо, оптимизация включена по умолчанию, поставлю нулевую и проверю!
Степень я не делю, а домножаю на коэффициент.
Да, с коэффициентом я ошибся: нужно 1/3! = 0.166667, а я взял 1/3*3! = 0.556.


X*X*X / Factr_3 - вы делитеsm.gif

X*X*X * Koef - вот так умножатьsm.gif...

отладка кейла - это отдельная песня, там еще есть трудности с переменным не влезающими к регистры, он их просто не отображает и так далее, но 90% проблем отладки под кейлом это отладка оптимизированного кода, я сначала думал что мир разрушился прежде чем понял что происходит
Lagman
Цитата(aaarrr @ Apr 26 2014, 17:12) *
Проверьте еще, на месте ли прототип вызываемой функции.

+1
Vladimir_T
Цитата(aaarrr @ Apr 26 2014, 17:12) *
Проверьте еще, на месте ли прототип вызываемой функции.

Прототип описан в .h - файле. Компиляция идет без ошибок.



Цитата(Vladimir_T @ Apr 26 2014, 17:02) *
Спасибо, оптимизация включена по умолчанию, поставлю нулевую и проверю!
Степень я не делю, а домножаю на коэффициент.
Да, с коэффициентом я ошибся: нужно 1/3! = 0.166667, а я взял 1/3*3! = 0.0556.
Т.е. вместо деления, делаю умножение на обратную величину. С элементарной математикой здесь нет ошибки, я проверил все на ПК, точность для меня приемлема. А на АРМе 966 не идет по Кейл.



Цитата(Golikov A. @ Apr 26 2014, 17:39) *
X*X*X / Factr_3 - вы делитеsm.gif

X*X*X * Koef - вот так умножатьsm.gif...

отладка кейла - это отдельная песня, там еще есть трудности с переменным не влезающими к регистры, он их просто не отображает и так далее, но 90% проблем отладки под кейлом это отладка оптимизированного кода, я сначала думал что мир разрушился прежде чем понял что происходит


Потратил время на отладку, хотелось бы получить ожидаемый результат. Мне можно было бы большую таблицу сгенерить и расположить на куче, но это уже другая реализация задачи...
Golikov A.
я обычно отлаживал сообщениями в порт, просто так привык. Но тут на фирме были жетаги и я решил воспользоваться чем то новым. А делали они автономные мобильные высоковольтные лаборатории, в общем отлаживал я в слабоотапливаемом гараже, под высоким напряжением, без интернета под рукой... И код, который прыгает со строчки на строчку, а при передачи в него 5 получает 7, на выход выдает 12.5 а на экранчике отображает -6.28.... я уже начал верить в тайные знаки, и в какую то беду 28 июня и так далее... намерзся, все проклял, и зарекся использовать жетаг. Сейчас я знаю в чем загвоздка, и иногда отлаживаю жетагом, но история был запоминающаяся....


Цитата
Прототип описан в .h - файле. Компиляция идет без ошибок.


да, надо еще проверить что функция в сишнике соответствует описанию в ашнике, потому что иначе кеил еще любит не известные параметры считать int32_t. То есть если вы создали функцию, объявили в ашнике, а потом изменили объявление в сишнике, что-то добавили, то в другом месте при вызове этой функции что-то может пойти не так, правда будет варнинг про неявное объявление...
aaarrr
Вообще, проще всего посмотреть содержимое R0 сразу после входа в функцию: тут уж отладчик не соврет никак.
Vladimir_T
Цитата(aaarrr @ Apr 27 2014, 14:36) *
Вообще, проще всего посмотреть содержимое R0 сразу после входа в функцию: тут уж отладчик не соврет никак.

Спасибо огромное за ценные советы. Дело было, конечно, в прототипе функции, некорректно описана. Пришел в понедельник, на свежую голову, да еще помня о Ваших советах и все заработало !!! Как здорово, что есть этот форум и его замечательные профессиналы!
Golikov A.
Вливайтесь!
Профессионалов все меньше, хамоватой школоты все больше, просторы инета полными глючных исходников, и все больше и чаще их применяют в коммерческих проектах без проверок...
Vladimir_T
bb-offtopic.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.