
Zitat von
Khabarakh:
Die Länge der Nachkommastellen kannst du nicht wirklich ermitteln, da du dort bei so gut wie jedem Wert auf eine Periode stoßen wirst - schließlich untersuchst du die Zahl zur Basis 10, gespeichert wird sie aber zur Basis 2. Du müsstest die Zahl erst in einem sinnvollen Maße runden, genau so, wie es FloatToStr macht.
[edit]Du kannst ja noch den mathematischen Weg testen. Wird wohl irgendwo zwischen den beiden anderen Methoden liegen.
Delphi-Quellcode:
function IntLength(const aInt : Integer) : Integer;
begin
Result := Ceil(Log10(aInt)); // bzw. Trunc(Ln(aInt) / Ln(10)) + 1
end;
[/edit]
Naja... Die erste Variante braucht zwar weniger Zeit, aber auch die math-
Unit, welche ja versucht wird zu verbannen

Und das Ceil ist ja nichts anderes als "Trunc() + 1" oder?
Meine Frage ist, wo kann man den Logaritmus so optimieren (in richtung Log10) gegenüber ln? Weil an sich machen ja beide das gleiche (Also das bei Ceil() und Trunc()).
Und zu den Extended: Da müsste man sich also mit den Vorkammastellen zufriedengeben... Oder?
[edit]Ehm...
Trunc() + 1 ist bis zu 100 ms schneller als Ceil() o.O
Delphi-Quellcode:
function IntLength3(const aInt : Integer) : Integer;
begin
Result := Trunc(Log10(aInt)) + 1; // bzw. Trunc(Ln(aInt) / Ln(10)) + 1;
end;
Das ist der gewinner mit
nur 79 ms um 900.000 berechnungen durchzuführen![/edit]
[edit]Wenn man nur die Log10()-Methode aus der math.pas kopiert funktionierts auch ohne uses. Aber ich glaube Borland sieht das nicht gerne oder? Vielleicht könnte man es legalisieren?[/edit]