Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.06 c
14-1080030832
Алексей
2004-03-23 11:33
2004.04.18
Где взять


7-1076832791
yorik
2004-02-15 11:13
2004.04.18
Подсказка в трее.


1-1080559054
Yurko
2004-03-29 15:17
2004.04.18
Убрать 3D рамку


6-1076660282
Layner
2004-02-13 11:18
2004.04.18
Можно ли создать TIdSMTP в безформеном приложении? (=сервис NT)


1-1080341683
ceval
2004-03-27 01:54
2004.04.18
Подскажите как программно в RadioGroup написать название





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский