Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Anzahl der Vorkommastellen bestimmen ??? (https://www.delphipraxis.net/30348-anzahl-der-vorkommastellen-bestimmen.html)

Cliff 23. Sep 2004 18:42


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

r_kerber 23. Sep 2004 18:50

Re: Anzahl der Vorkommastellen bestimmen ???
 
Moin Cliff,

wie wäre es mit dem Logarithmus zur Basis 10?

CT86 23. Sep 2004 18:51

Re: Anzahl der Vorkommastellen bestimmen ???
 
Hey,
so müsste es gehen
Delphi-Quellcode:
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;
Hoffe es hilft dir weiter :!:
mfg
CT86

d3g 23. Sep 2004 18:52

Re: Anzahl der Vorkommastellen bestimmen ???
 
Trunc(Log10(n) + 1). Achte auf negative Werte.

[edit]Vieeel zu langsam...[/edit]

Chewie 23. Sep 2004 18:52

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.

MisterNiceGuy 23. Sep 2004 19:31

Re: Anzahl der Vorkommastellen bestimmen ???
 
Delphi-Quellcode:
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;
Ist jetzt nicht getestet, hoffe er funktioniert :D

Ultimator 23. Sep 2004 19:43

Re: Anzahl der Vorkommastellen bestimmen ???
 
Geht nicht einfach
Delphi-Quellcode:
pos(',',floattostr(123,456))+1;
:gruebel:

Cliff 23. Sep 2004 19:50

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

Benmik 3. Okt 2020 12:36

AW: Re: Anzahl der Vorkommastellen bestimmen ???
 
Zitat:

Zitat von d3g (Beitrag 208214)
Trunc(Log10(n) + 1). Achte auf negative Werte.
[edit]Vieeel zu langsam...[/edit]

Aus gegebenem Anlass habe ich dieses Thema exhumiert. Vielleicht gibt es ja inzwischen bessere Ansätze, aber "Viel zu langsam" kann ich nicht nachvollziehen:
Delphi-Quellcode:
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;
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.

Gausi 4. Okt 2020 14:13

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 03:21 Uhr.
Seite 1 von 2  1 2      

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