Einzelnen Beitrag anzeigen

Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#1

(Division-/string-)Funktion weiter optimieren?

  Alt 5. Jan 2005, 13:22
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;
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat