Einzelnen Beitrag anzeigen

Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
762 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Berechnungen mit Gleitkomma Werten

  Alt 16. Feb 2024, 16:28
Danke für eure zahlreichen antworten, mir war nicht bewusst das die Abweichung beim Single so groß ist. Für das Erstellen des Dictionaries(Farb und Werte Zuordnung) runde ich einfach nach jeder Addition und das reicht erstmal aus. Mir ging es hier hauptsächlich um die Daten Typen und ich kann jetzt je nach Fall meine internen Berechnung darauf anpassen. Das wird darauf hinaus lauf das ich nur mit Integer/Int64 rechne und erst am Ende auf eine Gleitkomma Zahl um schwenke, denn so sollte sich der Fehler reduzieren lassen.
Viele Gleitkommatypen haben (etwas vereinfacht dargestellt) hinter dem Komma zum Speichern von Werten halt nur die Werte 0.5, 0.5^2, 0.5^3, 0.5^4, 0.5^5,... (bis zu einem gewissen n, 0.5^n) zur Verfügung. Für zum Beispiel n=10 kannst du dann nur die Zahlen der Form k=s1*0.5^1 + s2*0.5^2 + s3*0.5^3 +... + s10*0.5^10, wobei s[k]=0 oder 1 genau abspeichern; alle anderen nicht. D.h. von den vielen Kommazahlen können gerade mal 2^10=1024 genau gespeichert werden. (Bereits bei 4 dezimalen Nachkommastellen bist du also bei n=10 Bit mehr als am A...)

Du schreibst, dass du mit ganzzahligen Werten rechnen wirst. Das führt fast sicher zu mehr Geschwindigkeit bei den Berechnungen. Das Problem der Rechengenauigkeit bleibt aber natürlich genauso wie bei den Gleitkommazahlen bestehen (ein n bit unsigned integer kann nur 2^n voneinander verschiedene Zahlen speichern). Bei RGB Werten kannst du aber die Berechnungen mit integer Werten genügend genau approximieren.

Ich habe hier eine Prozedur gepostet, mit welcher du zu gegebenen Farbgewichten für R G B eine gute integer Approximation finden kannst (verwendete Norm natürlich anpassbar). Wenn du zusätzlich auch eine Translation der Farbwerte benötigst, musst du die Prozedur anpassen.

Wenn du Bilder bearbeitest und wie ich vermute Farbwerte mittels affiner Abbildung verändern willst, dann lohnt sich unter Umständen ein Blick in GDI+, dort Colormatrix. GDIPUTIL, GDIPOBJ, GDIPAPI in Delphi einbinden und loslegen . Die 5x5 (RGB Translation und Alpha) Matrix rechnet zwar auch mit Fliesskommazahlen, GDI+ arbeitet aber relativ schnell.

Je nach Aufgabe und Hardware (GDI+) lohnt sich selber rechnen.
Beispiele auf meinem Notebook:
(a) Umrechnung in Graustufe 1 Mio Pixel Bild 32 Bit.: mit integer Approximation: 1 ms. Mit GDI+: 15ms (GDI+ rechnet mit 5x5 Matrix und "doof" alle Werte für R G B einzeln).
(b) 1 Mio Pixel 32it: Mit integer Approximation 3x3 Matrix plus setzen Alphakanal: unter 3ms. Mit GDI+: 15ms.
(c) Wenn du statt mit integer Approximation mit Fliesskommazahlen rechnest, bist du weit über den GDI+ Zeiten.
Michael Gasser

Geändert von Michael II (16. Feb 2024 um 19:22 Uhr)
  Mit Zitat antworten Zitat