Forum: Algorithmen, Datenstrukturen und Klassendesign
by gammatester,
25. Jul 2018
Warum so kompliziert? Wenn man die UINT64-Beschränkung akzeptiert, kann man zB dies verwenden
function CalculateSize(Bytes, Multiplier: UInt64): UInt64;
var
i: integer;
begin
Result := Bytes;
for i:=1 to Multiplier do Result := Result*1024;
end;
Wenn man R/O-Checks eingeschaltet hat, erhält man eine Überschreitung frei Haus, ansonsten ist noch eine Zeile mehr notwendig. Man kann...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by gammatester,
24. Jul 2018
Ich frage jetzt zu letzen Mal: Warum kannst Du kein Double oder Extended verwenden? function CalculateSize(Bytes, Multiplier: Int64): Double;
Die Genauigkeit hast Du eh schon verloren, Du hast als Ergebnis ja max 53 signifikante Mantissa-Bits, es geht jetzt nur noch darum, keinen Integer-Overflow zu erhalten.
Forum: Algorithmen, Datenstrukturen und Klassendesign
by gammatester,
24. Jul 2018
Punkt1: Wieso kannst Du kein Double oder Extended nehmen? Punkt 2: Wie schon mehrfach vorgerechnet, passen 70 Bits weder in ein 64-Bit-Integer, noch ohne ein paar Bit Genauigkeitsverlust in ein Fließkomma mit 53- oder 64-Bit Mantisse. Du könntest natürlich Multi-Präzisions-Integer verwenden, aber ich halte das für Overkill.
Forum: Algorithmen, Datenstrukturen und Klassendesign
by gammatester,
24. Jul 2018
1024^7 ist als Operation nicht definiert. power(1024,7) Fließkomma und ein Hardcast nicht erlaubt. Es bleiben zwei unsinnige Konstruktionen
uses system.math;
var
x: double;
I: int64 absolute x;
begin
x := power(double(1024),7);
writeln('I absolute: ', I);
{$r-,q-}
I := 1024*1024*1024;
Forum: Algorithmen, Datenstrukturen und Klassendesign
by gammatester,
24. Jul 2018
Richtig. 1024=2^10 also 1024^7 = 2^70 und das maximale int64 is 2^63-1. Hier wirst Du nicht um Fließkomma herumkommen, am besten Double.
Forum: Algorithmen, Datenstrukturen und Klassendesign
by gammatester,
24. Jul 2018
Sorry, integer funktioniert knapp auch (benutzt 30 der 31 Bits). Habe mit 4096 getestet. Aber int64 ist sicherer.
Forum: Algorithmen, Datenstrukturen und Klassendesign
by gammatester,
24. Jul 2018
Das Ergebnis ist zu groß für integer. Gibt 0 weil Overflow für 32-Bit-Integer.
var I: Int64;
I := Round(Power(1024, 3));
geht aber.
Forum: Algorithmen, Datenstrukturen und Klassendesign
by gammatester,
24. Jul 2018
var X: Double;
X := Power(Double(1024), 3); // X := (1024 * 1024 * 1024)