Angenommen, wir haben eine lange Reihe von Doppelpunkten, sagen wir N == 1000000
.Wie berechnet man den Durchschnitt von Doppelpunkten, so dass der Gesamtfehler minimal ist?
array<double, N> arr;
Es gibt zwei naive Ansätze, um den Durchschnitt zu berechnen. Erst
double result = 0;
for (double x : arr) {
result += x;
}
result /= arr.size();
Dies kann ungenau sein, wenn die Summe der Werte sehr groß ist. Fließkommazahlen verlieren dann die Genauigkeit.
Ein weiterer Ansatz ist:
double result = 0;
for (double x : arr) {
result += x/arr.size();
}
Diese Genauigkeit verlieren kann, wenn die Zahlen klein sind.
Gibt es eine ausfallsichere Möglichkeit, einen einfachen Durchschnitt von Gleitkommazahlen zu berechnen? Lösungen, die nur die Standardbibliothek verwenden, werden geschätzt.
Der Anspruch ist unsinnig, Sie verlieren die Genauigkeit nicht aufgrund der Größe des Wertes. Dafür sorgt das Float im Fließkomma-Punkt. Die Anzahl der signifikanten Ziffern, die * double * speichern kann, hängt nicht vom Wert ab. Sie erhalten nur dann einen Fehler, wenn Sie mehr anzeigen. –
@HansPassant Es gibt ein Limit in der Binärdarstellung. Wenn zwei Floats hinzugefügt werden, werden die Exponenten verglichen. Das bedeutet, wenn Sie nur 4 Dezimalstellen darstellen können, wird durch Hinzufügen von 1.234e0 zu 1.234e3 zuerst der erste Wert in 0.001e3 umgewandelt und die niedrigen Ziffern werden verworfen. –