Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

Статистика   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
1-1080848872
mike_forewer
2004-04-01 23:47
2004.04.18
Сортировка в TStringGrid


1-1080818442
ruslan
2004-04-01 15:20
2004.04.18
меню в режиме runtime


6-1076854734
Vladimir Bolotin
2004-02-15 17:18
2004.04.18
Работа с открытими спамерскими базами (типа ORDB)


1-1080566510
TButton
2004-03-29 17:21
2004.04.18
Сравнить 2 record а


14-1080246459
Ломброзо
2004-03-25 23:27
2004.04.18
Хехех.. "Во вторник Земля налетит на небесную ось"