moin zusammen,
hab mal versucht ne funktion zu schreiben die 2 Integer-Werte dividiert und das ergebnis auf (mehr oder weniger) beliebig viele nachkommastellen ausgiebt.
schön und gut soweit, scheint auch alles zu laufen, aber ab so >20000 nachkommastellen wird's dann doch etwas langsam (25000 nachkommastellen = ~1200 ticks), zu dem zwecke wollte ich fragen ob jemand noch ideen hat wie man diese funktion weiter optimieren kann.
und wenn ihr dann noch mehr zeit für mich aufbringt könnte mir jemand einen denkanstoß geben wie man so ne art default-länge berechnen kann, bspw. 1/8 = 0.125 = 3 nachkommastellen (das is aber glaub ich nur was für die ganz hartgesottenen
)
naja, hier die funktion (falls es fragen gibt was was macht... fragt):
Delphi-Quellcode:
function DivStr(
const X,Y: Integer;
const Precision: Cardinal):
string;
procedure StrMove(
var Dest:
string;
const Source:
string; Count: Cardinal);
asm
PUSH ESI
PUSH EDI
MOV ESI,EDX
MOV EDI,[EAX]
REP MOVSB
POP EDI
POP ESI
end;
function ModDiv(
var X: Integer;
const Y: Integer): Integer;
asm //faster than computing mod and div seperately | note: Result := X div Y !
PUSH ECX
PUSH EDX
MOV ECX,EAX
MOV EAX,[EAX]
CDQ
IDIV DWORD PTR [ESP]
MOV [ECX],EDX
POP EDX
POP ECX
end;
var C,L: Cardinal;
I: Integer;
S:
string;
begin
S := IntToStr( X
div Y );
L := Length(S);
SetLength(Result,L + Precision + Byte(Precision <> 0));
StrMove(Result,S,L);
if Precision = 0
then Exit;
Result[L+1] := '
.';
I := X
mod Y;
for C := 1
to Precision
do begin
I := I * 10;
Result[L+C+1] := Char( Abs( ModDiv(I,Y) ) + 48);
end;
end;