![]() |
Anzahl der Vorkommastellen bestimmen ???
Hi,
ich habe da im Moment eine Blockade ;-) Ich suche einen einigermassen Effizienten Algorithmus mit dem ich die Anzahl der Vorkommastellen eines Reals bestimmen kann (Beispiel: 123,456 entspricht '3'). Kann mir da jemand auf die Sprünge helfen? Gruss Cliff |
Re: Anzahl der Vorkommastellen bestimmen ???
Moin Cliff,
wie wäre es mit dem Logarithmus zur Basis 10? |
Re: Anzahl der Vorkommastellen bestimmen ???
Hey,
so müsste es gehen
Delphi-Quellcode:
Hoffe es hilft dir weiter :!:
var
v: Integer; s: String; begin v := 14234.43245; Str(v:6:2, s); // die 6 steht für die Vorkommastellen Edit.Text := s; end; mfg CT86 |
Re: Anzahl der Vorkommastellen bestimmen ???
Trunc(Log10(n) + 1). Achte auf negative Werte.
[edit]Vieeel zu langsam...[/edit] |
Re: Anzahl der Vorkommastellen bestimmen ???
Ich würde auch dir Variante mit dem Zehner-Logarithmus empfehlen, da die AFAIK auf Intel-Rechner als Hardware-Variante zur Verfügung steht.
|
Re: Anzahl der Vorkommastellen bestimmen ???
Delphi-Quellcode:
Ist jetzt nicht getestet, hoffe er funktioniert :D
function Vorkommastellen(Zahl:Real):integer;
var I, erg:integer; hlp:string; begin erg := 0; hlp := floattostr(Zahl); for i:=1 to length(hlp) do begin if hlp[i] <> ',' //Oder Punkt, je nachdem wie du trennst then erg := erg+1 else break; end; result := erg; end; |
Re: Anzahl der Vorkommastellen bestimmen ???
Geht nicht einfach
Delphi-Quellcode:
:gruebel:
pos(',',floattostr(123,456))+1;
|
Re: Anzahl der Vorkommastellen bestimmen ???
Wow, was für eine Reaktion
big THX! Ich dachte mir schon das ich irgendwie mit dem Logarithmus weiterkomme, aber irgendwie hat es gehakt. An die Variante mit den Strings wollte ich zunächst nicht 'ran, da ich dachte das es da evtl. noch eine geschicktere Möglichkeit gibt. Werde wohl einmal beide Möglichkeiten in eine Schleife schicken und schauen welche auf meinem PC die geeignetere ist... Danke nochmal! Gruss Cliff |
AW: Re: Anzahl der Vorkommastellen bestimmen ???
Zitat:
Delphi-Quellcode:
100 Millionen Durchläufe dauern auf meinem Rechner ca. 1,7 Sekunden, das sind etwa 17,3 Nanosekunden je Berechnung. Ohne das Abs ist es noch eine Nanosekunde weniger. Die Stringlösung dauert etwa 15 Mal länger.
procedure TestCode;
var Dbl1,Dbl2:Double; i,Bis:integer; StopWatch:TStopWatch; begin Dbl2 := 654321.123456; StopWatch := TStopWatch.StartNew; Bis := Min(100000000,High(integer)); For i := 0 to Bis do begin Dbl1 := Floor(1 + Log10(Abs(Dbl2))); // Dbl1 := Pos(',',FloatToStr(Dbl2)) + 1; end; StopWatch.Stop; ShowMessage(Format('%d %s%.0n %s%0.7n7 %s', [StopWatch.ElapsedMilliseconds,'msec (',Bis/1,'Dateien)' + NZ,StopWatch.ElapsedMilliseconds/Bis,'msec je Durchlauf'])); Application.Terminate; end; |
AW: Anzahl der Vorkommastellen bestimmen ???
Ich denke, dass das Edit "Viel zu langsam" vor 16 Jahren so gemeint war, das ganze zwei Minuten vorher die Antwort mit dem Logarithmus auch schon gegeben wurde, was aber erst nach dem Absenden der Antwort bemerkt wurde. :wink:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz