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?
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%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 .
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%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.
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.
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
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.
Tags und Links algorithm floating-point numerical-analysis