Quelle est la façon la plus précise de compter une somme d'éléments vectoriels à l'aide std :: Accumuler? [dupliquer]

StackOverflow https://stackoverflow.com/questions/6800810

Question

Possible en double: C ++ float question de précision

J'ai un problème de déterminer la méthode la plus précise des trois pour calculer la somme des éléments vectoriels, qui ne peuvent être que des nombres positifs, en utilisant std :: Accumuler.

1)

double sum(vector<float> &v)
{
     return accumulate(v.begin(), v.end(), 0.0);
}

2)

double sum(vector<float> &v)
{
     sort(v.begin(), v.end());
     return accumulate(v.begin(), v.end(), 0.0);
}

3)

double sum(vector<float> &v)
{
     sort(v.begin(), v.end(), greater<float>());
     return accumulate(v.begin(), v.end(), 0.0);
}

Ceci est une sorte de question d'entrevue d'emploi, voilà pourquoi j'ai obtenu ces trois façons particulières de calculer la somme. Je l'ai fait beaucoup de recherche sur le Web, mais ne pouvait pas comprendre la différence. Pouvez-vous m'aider les gars comprendre?

Était-ce utile?

La solution

La différence devrait être vraiment petit, mais en commençant par les plus petits nombres sera un peu plus précis. Pensez à des fins d'exposition que votre numéro de virgule flottante ne contenait que 4 chiffres significatifs et un exposant, et qu'il était décimal plutôt que binaire. En utilisant les chiffres:

a = 5000
b = 5000
c = 1000e4 (10000000)

Si l'on ajoute c d'abord, puis soit a ou b, le plus petit des deux tombe la représentation et est arrondie. Le résultat final de c + b + a donnera 1000e4. Si d'autre part, nous ajoutons a et b d'abord, nous obtenons 1e4 comme la première valeur intermédiaire, et en ajoutant que la c donnera 1001e4 ce qui est un résultat plus précis pour l'opération.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top