реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> LPC1343. Ошибка вычислений., Большая погрешность.
EXeGLuMATOR
сообщение May 28 2010, 08:08
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



День добрый!
Имеется небольшой девайс для определения координат. На ультразвуке. Простейшие формулы для вычислений.
например:
Код
.....
#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


Где могут притаиться грабли?
Может использовать какую-либо математическую библиотечку? Какую?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 28 2010, 08:15
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Для проверки объявите все переменные как int. Ну и попробуйте переписать:

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

на

x1 = (((BB  - AA + CC)/2/c)-c)
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение May 31 2010, 06:02
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Объявил как int.
Вроде стало нормально, ну + еще усреднение по нескольким точкам - вроде пляски значений нету - разброс значений после усреднения 1-5, при неподвижном излучателе (ну, если не считать тремор smile.gif ). Осталось провести натурные эксперименты.
Пока перестановку значений в формуле не делал - может и не понадобится...
Спасибо.
Go to the top of the page
 
+Quote Post
XVR
сообщение May 31 2010, 09:07
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Вот тут
Код
           BB = b*b;
           AA = a*a;
           CC = c*c;
происходит переполнение, т.к. умножения вычисляются в short'ах, а потом результат переводится в long. А должно быть наоборот
Код
           BB = b*(long)b;
           AA = a*(long)a;
           CC = c*(long)c;
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th July 2025 - 08:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01406 секунд с 7
ELECTRONIX ©2004-2016