Forum: Algorithmen, Datenstrukturen und Klassendesign
by mensch72,
23. Nov 2014
=> solange alles es in der Wertebereich der Operatoren passt, bei Ganzzahl-Arithmetik IMMER erst "vergrößern" (also addieren oder multiplizieren oder "shl") und dann verkleinern(also subtrahieren, dividieren oder "shr")
=> weil Pascal hier nicht immer das mach was ich will oder ich auch oft zu nur faul zum Nachzudenken, was der Kompiler draus macht, gebe ich es lieber vor), klammere da lieber...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by mensch72,
23. Nov 2014
super... das war eigentlich exakt das was ich dir gerade als "Berechnungslösung" vorschlagen wollte, denn auch wenn ich das vor Jahren woanders her kopiert habe... das sieht einfach schön klar aus:)
Ich würde aber eine zusätzliche Sicherheitsklammerung einführen, damit auch wirklich erst multipliziert wird und erst dann dividiert(shr 8) wird... das sollte genauer sein, wenn hier bicht...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by mensch72,
22. Nov 2014
Wenn der Compiler sagt, das da Irgendwo kein Integer ist funktioniert das mit "shr 8" nicht... morgen werfe ich ml kurz mein Delphi an und finde das "Syntax" Problem... muss ja meine Pascalsyntax "schulen".
Auch macht SHR Mist, bei negativen Zahlen... ich tippe es mal komplett als "unsigned int" ähhh "cardinal"... muss aber erst noch verstehen, "warum" du aktuell den Weg über negative werte...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by mensch72,
22. Nov 2014
Sorry, der "Sicherheits-Cast" muss Integer(...) und nicht int(xxx) heißen!
also
i := RGBA_Unten^.rgbBlue - (((Integer(RGBA_Unten^.rgbBlue - RGBA_Oben^.rgbBlue) * Integer(RGBA_Oben^.rgbReserved)) div 256);
und
i := RGBA_Unten^.rgbBlue - (((Integer(RGBA_Unten^.rgbBlue - RGBA_Oben^.rgbBlue) * Integer(RGBA_Oben^.rgbReserved)) shr 8);
(ich sollte nicht so viel C++ programmieren;) )
Forum: Algorithmen, Datenstrukturen und Klassendesign
by mensch72,
22. Nov 2014
Eine Bitte:
mach dir mal für mich die Mühe und "messe" die Zeiten noch für diese 2 Varianten:
i := RGBA_Unten^.rgbBlue - (((Int(RGBA_Unten^.rgbBlue - RGBA_Oben^.rgbBlue) * Int(RGBA_Oben^.rgbReserved)) div 256);
und
i := RGBA_Unten^.rgbBlue - (((Int(RGBA_Unten^.rgbBlue - RGBA_Oben^.rgbBlue) * Int(RGBA_Oben^.rgbReserved)) shr 8);
(für je alle 3 Farben halt)
Das wird genauso exakt und...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by mensch72,
22. Nov 2014
Ich verwende "/256" statt "/255".
MulDiv ist live wegen der internen multiplen 32Bit über Int64 Logik Langsamer als aktuelle FPU Nutzung, aber mit ging es ums erkennen des Prinzips!
wenn aus "Round (RGBA_Unten^.rgbBlue - ((RGBA_Unten^.rgbBlue - RGBA_Oben^.rgbBlue) / 255 * RGBA_Oben^.rgbReserved));"
besser "RGBA_Unten^.rgbBlue - ((RGBA_Unten^.rgbBlue - RGBA_Oben^.rgbBlue) *...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by mensch72,
22. Nov 2014
man nehme einfach "MULDIV" für solche Berechnungen in Integer ohne Genauigkeitsverlust.
aus: i := Round (RGBA_Unten^.rgbBlue - ((RGBA_Unten^.rgbBlue - RGBA_Oben^.rgbBlue) / 255 * RGBA_Oben^.rgbReserved));
wird dann: i := RGBA_Unten^.rgbBlue - MulDiv(RGBA_Unten^.rgbBlue - RGBA_Oben^.rgbBlue, RGBA_Oben^.rgbReserved, 255);
Mit Zusatzvariable und nur einer Dereferenzierung am Schleifenanfang,...