Einzelnen Beitrag anzeigen

Michael II

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

AW: Formulargröße auf HighDPI-Monitor speichern

  Alt 13. Apr 2019, 23:01
Ja du musst aber natürlich in deiner MulDiv() deine Rundungsfunktion MathRound() verwenden - so wie von dir gepostet verwendest du trunc().

Also so:
 Result := MathRound( (nNumber * nNumerator) / nDenominator); Weiter musst du den Fall nDenominator=0 abfangen (Result := -1) und auch mögliche Überläufe ((nNumber * nNumerator) / nDenominator kann so gross werden, dass das Resultat nicht in einem integer Platz hat).


Weiteres Problem: Möglicher integer Überlauf bei der Multiplikation nNumber * nNumerator

Deine MulDiv Funktion liefert zum Beispiel für
Delphi-Quellcode:
var x : integer;
begin
    x := MulDiv( maxint div 2, maxint div 2, maxint div 2 );
x = -2, müsste aber natürlich maxint div 2 zurückgeben.

Schreibe deshalb int64(nNumber) * int64(nNumerator) statt nNumber * nNumerator, sonst hast du wenig Freude, wenn nNumber * nNumerator > maxint.

OK für deinen "Fenster-Fall" wirst du kaum je solche Werte als Argumente haben. Aber wenn du MulDiv nachbilden willst, dann musst du darauf achten.
Michael Gasser
  Mit Zitat antworten Zitat