Supposons que je veuille calculer la valeur moyenne d'un tel queempêche la moyenne longue durée de débordement?
class Averager {
float total;
size_t count;
float addData (float value) {
this->total += value;
return this->total/++this->count;
}
}
tôt ou tard, la valeur total
ou count
série de données débordera, donc je le faire ne se rappelle pas la valeur totale par:
class Averager {
float currentAverage;
size_t count;
float addData (float value) {
this->currentAverage = (this->currentAverage*count + value)/++count;
return this->currentAverage;
}
}
il semble qu'ils déborderont plus, mais la multiplication entre average
et count
problème conduit à débordement, donc la prochaine solution est:
class Averager {
float currentAverage;
size_t count;
float addData (float value) {
this->currentAverage += (value - this->currentAverage)/++count;
return this->currentAverage;
}
}
semble mieux, le prochain problème est comment empêcher count
de débordement?
Je pense que le problème de l'imprécision numérique est plus important que le débordement. – kennytm
Il est très peu probable que 'total' déborde. Il perdra de la précision s'il devient beaucoup plus grand que la moyenne. –
@kenny: il y aura une certaine perte de précision, mais à mesure que le nombre augmente, toute valeur ajoutée est moins sensible à la moyenne, elle pourrait être résolue statistiquement. – uray