Главная страница
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.027 c
14-1080155355
YurikGl
2004-03-24 22:09
2004.04.18
Центр сертификации


1-1080420635
Vadim
2004-03-27 23:50
2004.04.18
Как сделать замену символов в TRichEdit ?


1-1080891457
EthernalWonderer
2004-04-02 11:37
2004.04.18
анимированный gif


6-1074576336
2ac
2004-01-20 08:25
2004.04.18
Как узнать свой текущий IP?


1-1080411855
leonidus
2004-03-27 21:24
2004.04.18
Как получить текущее время с точностью до миллисекунд?