Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC1343. Ошибка вычислений.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
EXeGLuMATOR
День добрый!
Имеется небольшой девайс для определения координат. На ультразвуке. Простейшие формулы для вычислений.
например:
Код
.....
#include "math.h"

volatile short a, b, X, Y;
volatile long x1, T, TT, CC, BB, AA;
#define c 264
#define base1 16384

......
            BB = b*b;
            AA = a*a;
            CC = c*c;
            if ( a < b ) {
                    x1 = (((BB + CC - AA)/2/c)-c);
                    Y = base1 - x1;
                    T = (x1 + c);
                    TT = T*T;
                    X = sqrt(BB - TT);
            }
.....


a, b - значения задержек от таймера.

Столкнулся со следующей проблемой - очень большой разброс полученных результатов - при изменении a, b на 2-3 значения - X, Y - могут отличаться на сотни и даже тысячу. Причем не понял закономерности - могут через значение, могут через 10, а могут и нормально идти и ни разу не вывалиться за допуск (50).
Попробовал при тех-же значениях а, b просчитать в Екселе - результат разный! Причем отличается на сотни! Понимаю конечно, целочисленная арифметика и т.п. - но не так-же.
Все значения выводятся на USB, который в ROM.

Компилятор Keil 4.11


Где могут притаиться грабли?
Может использовать какую-либо математическую библиотечку? Какую?
sergeeff
Для проверки объявите все переменные как int. Ну и попробуйте переписать:

Код
x1 = (((BB + CC - AA)/2/c)-c)

на

x1 = (((BB  - AA + CC)/2/c)-c)
EXeGLuMATOR
Объявил как int.
Вроде стало нормально, ну + еще усреднение по нескольким точкам - вроде пляски значений нету - разброс значений после усреднения 1-5, при неподвижном излучателе (ну, если не считать тремор smile.gif ). Осталось провести натурные эксперименты.
Пока перестановку значений в формуле не делал - может и не понадобится...
Спасибо.
XVR
Вот тут
Код
           BB = b*b;
           AA = a*a;
           CC = c*c;
происходит переполнение, т.к. умножения вычисляются в short'ах, а потом результат переводится в long. А должно быть наоборот
Код
           BB = b*(long)b;
           AA = a*(long)a;
           CC = c*(long)c;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.