Was ist der genaueste Weg, um eine Summe von Vektorelementen unter Verwendung von STD :: zu zählen? [Duplikat

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

Frage

Mögliches Duplikat:
C ++ Float -Präzisionsfrage

Ich habe das Problem, die genaueste Methode der drei zu bestimmen, um die Summe der Vektorelemente zu berechnen, die nur positive Zahlen unter Verwendung von std :: akkumulieren können.

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);
}

Dies ist eine Art von Vorstellungsgesprächsfrage. Deshalb habe ich diese speziellen Möglichkeiten erhalten, die Summe zu berechnen. Ich habe viel im Internet gesucht, konnte aber den Unterschied nicht herausfinden. Könntest du mir bitte helfen, Jungs zu verstehen?

War es hilfreich?

Lösung

Der Unterschied sollte sehr klein sein, aber beginnend mit den kleineren Zahlen ist etwas genauer. Überlegen Sie sich zu den Ausstellungszwecken, dass Ihre schwimmende Punktzahl nur 4 signifikante Ziffern und einen Exponenten enthielt und dass sie eher dezimal als binär war. Verwenden der Zahlen:

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

Wenn wir hinzufügen c zuerst dann entweder a oder b, Der kleinere der beiden fällt von der Darstellung ab und ist abgerundet. Das Endergebnis von c + b + a wird nachgeben 1000e4. Wenn dagegen wir hinzufügen, fügen wir hinzu a und b Zuerst bekommen wir 1e4 als erster Zwischenwert und Hinzufügen zu diesem zu Hinzufügen zu c wird nachgeben 1001e4 Dies ist ein genaueres Ergebnis für den Betrieb.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top