Durchschnitt von zwei Werten berechnen, Fehler minimieren

8

Ich mache einige Gleitkommaberechnungen und die Ergebnisse sind nicht so genau wie ich es möchte.

Dies ist der Algorithmus:

%Vor%

min_x, max_x und old_x sind alle Floats. Ich glaube, dass der größte Fehler entsteht, wenn ich den Durchschnitt von Max und Min nehme, und dann wird der Fehler mit dem Faktor multipliziert (der ein Float sein kann).

Wie kann ich den Fehler aufgrund der FP-Berechnung minimieren, so dass new_x so genau wie möglich ist?

    
MxyL 24.06.2011, 17:19
quelle

5 Antworten

4

Wenn old_x und center in der Nähe sind, verlieren Sie die Präzision.

Es heißt Bedeutungsverlust

Sie können die Berechnung so ändern, dass die Subtraktion am Ende geschieht:

%Vor%     
Yochai Timmer 24.06.2011, 17:26
quelle
2

Abhängig von Ihrer Sprache gibt es wahrscheinlich einen numerischen Typ mit fester / beliebiger Genauigkeit, den Sie verwenden können, z. B. dezimal in Python oder BigDecimal in Java .

    
limscoder 24.06.2011 17:25
quelle
2

Alle vorherigen Implementierungen verwenden keine Rundung und haben daher einen großen Fehler: Hier ist, wie dies in Fixpunkt Mathe zu tun: Ich verwende X.1u prevision (1 LSB wird für Bruchteil verwendet).

%Vor%

Wenn der Faktor auch ein fester Punkt (Integer) ist und N Bits den Bruch beschreiben, dann kann new_x wie folgt berechnet werden:

%Vor%
  • (center & lt; & lt; N) hat N + 1 Bruchbits
  • distance * factor hat N + 1 Bruchbits
  • (1 & lt; & lt; N) ist eine "Hälfte" als 1 & lt; & lt; (N + 1) ist in der obigen Festkomma-Genauigkeit "Eins".

Nach dem Verständnis jedes Teils kann die obige Zeile komprimiert werden:

%Vor%

Der verwendete Integertyp sollte natürlich groß genug sein. Wenn der gültige Bereich unbekannt ist, sollte man die Eingabe für diese Funktion und etwas anderes überprüfen. In den meisten Fällen wird dies nicht benötigt.

Das ist so gut wie es in der Fixpunkt Mathematik ist. So führen HW-Schaltungen ganzzahlige mathematische Operationen durch.

    
egur 26.11.2013 08:29
quelle
1

Dies beseitigt mindestens eine Fehlerquelle von Ihrem ursprünglichen Algorithmus:

%Vor%

Wenn Sie mehr über die Beziehung zwischen old_x , min_x und max_x wissen, können Sie wahrscheinlich bessere Ergebnisse erzielen.

    
Novelocrat 24.06.2011 22:22
quelle
1

Wie Yochai sagt, wird Ihr Problem wahrscheinlich durch die Subtraktion old_x - center verursacht. Wenn old_x und center nahe beieinander liegen, verlieren Sie die Genauigkeit.

Die einfache Lösung wäre die Berechnung mit double anstelle von float , aber ich denke, das ist nicht möglich. In diesem Fall müssen Sie die Subtraktion beseitigen. Eine Möglichkeit ist

%Vor%

Dies hilft, wenn max_x , min_x und center ziemlich weit auseinander liegen, während der Durchschnitt von max_x und min_x nahe bei center liegt. Wenn das nicht hilft, können Sie vielleicht die Berechnung von max_x so anpassen, dass Sie tatsächlich max_x - center berechnen, aber Änderungen in dem Teil benötigen, den Sie uns nicht gezeigt haben.

    
Jitse Niesen 25.06.2011 12:36
quelle