Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Berechnungen mit Gleitkomma Werten (https://www.delphipraxis.net/214657-berechnungen-mit-gleitkomma-werten.html)

Andreas13 16. Feb 2024 14:46

AW: Berechnungen mit Gleitkomma Werten
 
Siehe noch
https://www.delphipraxis.net/211382-...-extended.html

Michael II 16. Feb 2024 15:28

AW: Berechnungen mit Gleitkomma Werten
 
Zitat:

Zitat von itblumi (Beitrag 1533580)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz