Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi (Division-/string-)Funktion weiter optimieren? (https://www.delphipraxis.net/37395-division-string-funktion-weiter-optimieren.html)

Nothine 5. Jan 2005 12:22


(Division-/string-)Funktion weiter optimieren?
 
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 :mrgreen:)

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;

Nothine 7. Jan 2005 10:50

Re: (Division-/string-)Funktion weiter optimieren?
 
keiner ne idee? :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz