|
|
  |
Ошибк при передаче значений переменной в функцию |
|
|
|
Apr 26 2014, 03:52
|
Знающий
   
Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073

|
Здравствуйте, подскажите, пожалуйста... Странная ситуация, не должно быть так, но у меня то есть.... Мне нужно быстро вычислять значения функции синус, для чего стал использовать разложение в степенной ряд, первым членом ограничился. Стал отлаживать, а функция постоянно мне выдает бесконечно малую величину, стал смотреть отладчиком в Кейле 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; }
|
|
|
|
|
Apr 26 2014, 13:39
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(Vladimir_T @ Apr 26 2014, 17:02)  Спасибо, оптимизация включена по умолчанию, поставлю нулевую и проверю! Степень я не делю, а домножаю на коэффициент. Да, с коэффициентом я ошибся: нужно 1/3! = 0.166667, а я взял 1/3*3! = 0.556. X*X*X / Factr_3 - вы делите X*X*X * Koef - вот так умножать  ... отладка кейла - это отдельная песня, там еще есть трудности с переменным не влезающими к регистры, он их просто не отображает и так далее, но 90% проблем отладки под кейлом это отладка оптимизированного кода, я сначала думал что мир разрушился прежде чем понял что происходит
|
|
|
|
|
Apr 27 2014, 05:24
|
Знающий
   
Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073

|
Цитата(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 - вы делите X*X*X * Koef - вот так умножать  ... отладка кейла - это отдельная песня, там еще есть трудности с переменным не влезающими к регистры, он их просто не отображает и так далее, но 90% проблем отладки под кейлом это отладка оптимизированного кода, я сначала думал что мир разрушился прежде чем понял что происходит Потратил время на отладку, хотелось бы получить ожидаемый результат. Мне можно было бы большую таблицу сгенерить и расположить на куче, но это уже другая реализация задачи...
|
|
|
|
|
Apr 27 2014, 06:05
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
я обычно отлаживал сообщениями в порт, просто так привык. Но тут на фирме были жетаги и я решил воспользоваться чем то новым. А делали они автономные мобильные высоковольтные лаборатории, в общем отлаживал я в слабоотапливаемом гараже, под высоким напряжением, без интернета под рукой... И код, который прыгает со строчки на строчку, а при передачи в него 5 получает 7, на выход выдает 12.5 а на экранчике отображает -6.28.... я уже начал верить в тайные знаки, и в какую то беду 28 июня и так далее... намерзся, все проклял, и зарекся использовать жетаг. Сейчас я знаю в чем загвоздка, и иногда отлаживаю жетагом, но история был запоминающаяся.... Цитата Прототип описан в .h - файле. Компиляция идет без ошибок. да, надо еще проверить что функция в сишнике соответствует описанию в ашнике, потому что иначе кеил еще любит не известные параметры считать int32_t. То есть если вы создали функцию, объявили в ашнике, а потом изменили объявление в сишнике, что-то добавили, то в другом месте при вызове этой функции что-то может пойти не так, правда будет варнинг про неявное объявление...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|