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.