предположим, что я хочу вычислить среднее значение набора данных, например
class Averager {
float total;
size_t count;
float addData (float value) {
this->total += value;
return this->total / ++this->count;
}
}
рано или поздно значение total
или count
будет переполнено, поэтому я делаю так, чтобы общее значение не запоминалось на:
class Averager {
float currentAverage;
size_t count;
float addData (float value) {
this->currentAverage = (this->currentAverage*count + value) / ++count;
return this->currentAverage;
}
}
кажется, что они будут переполняться дольше, но умножение между average
и count
приводит к проблеме переполнения, поэтому следующее решение:
class Averager {
float currentAverage;
size_t count;
float addData (float value) {
this->currentAverage += (value - this->currentAverage) / ++count;
return this->currentAverage;
}
}
кажется лучше, следующая проблема - как предотвратить переполнение count
?