Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизСтатистика Найти похожие ветки
← →
zoom (2004-03-30 14:03) [0]Проблема такая: У меня по таймеру каждую секунду обновляются некие данные в процентах. После отработки приложения, мне нужно вычислить средней показатель этих данных. Как известно чтобы узнать среднее, нужно всё сложить и поделить на количество слогаемых, но тк программа может работать очень долго, то сумма чисел и кол-во слогаемых сильно растёт.
Каким образом можно избежать этого роста чисел?
Первое, что приходит на ум это: Ввести 2 переменные - сумма и количество (A и A1). Как только A1 становиться больше, например, сотни находить из той суммы среднее, и перекидовать его в другую переменную, со своей флажковой переменной (B и B1). И когда B1 тоже достигнет сотни, повторить действия, как с переменными A - то есть организовать систему ступеней.
Мне такой метод кажется убогим. К тому же при прекращении работы программы может сложиться ситуация, когда и A и B и С и D(...) заполены до определённого количества и все данные в итоге нужно как-то подсчитывать, где и начинают возникать трудности.
Вопрос: Как организовать систему статистики БЕЗ использования ступеней.
← →
Семен Сорокин © (2004-03-30 14:15) [1]сделай наследника TList.
← →
Плохиш (2004-03-30 14:22) [2]>zoom (30.03.04 14:03)
srednee := (srednee + nowoe) / 2;
← →
Johnmen © (2004-03-30 14:23) [3]avg:=0; n:=1;
На каждом шаге итерации
avg:=avg*((n-1)/n))+Xn/n;
n:=n+1;
где Xn - текущее добавляемое значение, n - тек.шаг/тек.кол-во значений
← →
Юрий Зотов © (2004-03-30 14:25) [4]Именно ввести 2 переменные:
сумма S: extended
количество N: cardinal;
Вначале их надо обнулить. На каждом шаге - наращивать S и инкрементировать N. В конце - разделить S на N.
И никаких премудростей. Полагаю, Ваша программа не будет работать настолько долго, чтобы сумма процентов превысила 10^4932, а количество шагов - 4.294.967.295 ?
← →
Семен Сорокин © (2004-03-30 14:25) [5]Плохиш (30.03.04 14:22) [2]
твоя неправда, найди своим методом среднее между 5, 7 и 9, - получишь 7.5, а реально - 7.
← →
Anatoly Podgoretsky © (2004-03-30 14:28) [6]Extended 10^4096 и точность 20 знаков
Количество Integer 2 милллиардаю а In64 10^20 можно посчитать сколько лет потребуется, чтобы перепонить.
← →
TUser © (2004-03-30 14:30) [7]count:=0;
while not endOfWork do begin
work;
inc (count);
if count=1 then srednee:=novoe
else srednee:=(srednee/(count-1)+novoe)/count
end;
← →
han_malign © (2004-03-30 14:38) [8]>а количество шагов - 4.294.967.295 ?
- уже исходя из этого, сумма процентов не превысит 429.496.729.500(что влезет, без потери точности, даже в double)
З.Ы. Если инкрементинровать каждую миллисекунду, то 4.294.967.295 это "49.7 days"
← →
zoom (2004-03-30 15:31) [9]Примерно так я всё себе и представлял. А плохиш совершил ту самую ошибку, которая отличает рбычного человека от програмиста =))
← →
Brahman © (2004-03-30 16:57) [10]>А плохиш совершил ту самую ошибку
Просто он торопится высказаться, а ему уже посоветовали пока только слушать:))
TUser © (30.03.04 14:30) [7]
Ошибка
srednee/(count-1) -> srednee*(count-1)
← →
Brahman © (2004-03-30 17:00) [11]S(i) = S(i-1) + X(i)/N
Обычно так считают с небольшой потерей точности
При большом N несущественно
← →
zoom (2004-03-31 12:57) [12]to Brahman:
Гм..
S это среднее, I это каунтер, N это новое. А то такое Х?
← →
TUser © (2004-03-31 15:11) [13]Нет. У Брахмана X - это новое, а N - это количество. Но эта формула примегнима при заранее известном N, а ты его не знаешь. Поэтому надо N всевремя высчитывать, а считавть так
S(i):=(S(i-1)*(N-1)+X(i))/N
Об этом вроде уже говорили здесь разными словами.
← →
zoom (2004-04-01 16:52) [14]Ну понятно... Спасибо всем!!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.05 c