Я придумал этот
n=1;
curAvg = 0;
loop{
curAvg = curAvg + (newNum - curAvg)/n;
n++;
}
Я думаю, что основные моменты этого пути:
- Он избегает больших чисел (и возможного переполнения, если вы суммируете, а затем разделите)
- вы сохраняете один регистр (не нужно хранить сумму)
Проблема может быть связана с суммирующей ошибкой - но я предполагаю, что в общем случае должны быть сбалансированные числа округления и округления вниз, чтобы ошибка не суммировалась резко.
Вы видите какие-либо подводные камни в этом решении? Есть ли у вас лучшее предложение?