Hier geht es auch ausschließlich um + , - , shr , and und Größer-/Kleinervergleiche, also um das Einfachste, was geht und wo man praktisch algorithmisch nichts optimieren kann.
Leider kann meine Lib kein binäres AND und SHR, bzw. nicht direkt, da sie durchweg dezimal arbeitet, hat sie Probleme mit 2er-Potenzen, die in ein 10er System nicht rein passen.
Es wäre alles besser, hätten wir 4 Finger, inkl. Daumen.
SHR kann ich ja noch durch eine extrem unoptimale Division ersetzen, aber beim AND müsste ich dann auch in jedem Durchlauf das dreifach umrechnen.
Delphi-Quellcode:
uses
System.SysUtils,
Winapi.Windows, System.Diagnostics,
StringMatheLib
in '
stringmathelib_131\StringMatheLib.pas',
StringMatheRec
in '
stringmathelib_131\StringMatheRec.pas';
begin
try
{const}var ten: MatheString := 10;
{const}var two: MatheString := 2;
var soll := Power(two, 255);
var z := Power(two, 128) - 1;
var sub := Power(ten, 77)
div 9;
var a := Power(two, 127) + 29;
var b := Power(two, 127) - 25;
var c := MatheString(0);
var nad := 64;
var nsu := 64;
var watch := TStopwatch.StartNew;
for var nn := 0
to 25000000
do begin
c := a * b;
while c < soll
do begin
c := c + sub;
Inc(nad);
end;
while c > soll
do begin
c := c - sub;
Inc(nsu);
end;
a := c
div '
340282366920938463463374607431768211456';
//a := c shr 128;
b := c
and z;
end;
var duration := watch.Elapsed.TotalSeconds;
WriteLn('
c0',
string(c));
WriteLn('
ad=', nad, '
su=', nsu, '
in ', duration:1:8, '
sec');
except
on E:
Exception do
WriteLn(E.ClassName, '
: ', E.
Message);
end;
end.