Was ist der genaueste Weg, um eine Summe von Vektorelementen unter Verwendung von STD :: zu zählen? [Duplikat
-
22-10-2019 - |
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?
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.