(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; |
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