![]() |
Aus wievielen Ziffern besteht meine Ganzzahl??
Hallo!!
Ich frag mich gerade, wie man am elegantesten die Anzahl der Stellen einer Ganzzahl ermittelt?? Ich hätt halt sonst gefühlsmässig den Integer in einen String umgewandelt und mit Length die Anzahl bestimmt??!! Ist das so ok oder gibts was besseres?? LG Thomas |
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Du kannst auch in einer Schliefe solange "div 10" machen, bis deine Zahl 0 ist. Und natürlich die Anzahl der divs zählen.
|
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Ok...danke!!
|
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Delphi-Quellcode:
[Edit]Formel verbessert
ZiffernCount := 1+Int(Abs(ln(Ganzzahl))/ln(10));
[Edit1] +1 hinzugefügt |
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Length(IntToStr(X)) dürfte auch gehen. Wie elegant bzw. schnell sowas ist weiß ich allerdings nicht.
|
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Zitat:
|
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Zitat:
Auch ich würde diesen Weg gehen. |
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Zitat:
|
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Tatsächlich,
habe mal ein paar Messungen mit folgendem Code durchgeführt:
Delphi-Quellcode:
wobei ich jeweils eine zehnstellige Zahl übergeben habe.
Function TForm1.DivMethod(_Value: Integer): Integer;
Begin Result := 0; While _Value > 0 Do Begin _Value := _Value Div 10; Inc(Result); End; End; Function TForm1.StrMethod(_Value: Integer): Integer; Begin Result := Length(IntToStr(_Value)); End; Bei einmaligem Aufruf der beiden Funktionen ergab sich im Durchschnitt (bei 10 Testläufen) ein auf die Laufzeit bezogener Faktor von 10,29 zu Gunsten der DivMethod-Funktion. Für den einmaligen Gebrauch ist diese also tatsächlich deutlich schneller. Anschliessend habe ich die Funktionen 100000 mal aufrufen lassen. Hier sinkt der Faktor allerdings auf minimale 1,10 ab. Nun meine Frage: Wie kommt das? Werden da irgendwelche Werte 'zwischengespeichert' und wiederverwendet, so dass auf Dauer gesehen die StrMethod-Methode vielleicht sogar schneller werden würde als die DivMethod-Methode? |
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Hast du von den Zeitwerten den Durchschnitt gebildet, hast du das Minimum genommen, wie hast du Zeit gemessen. Da kann dir einiges in die Quere kommen. Auch Krokos Variante dürfte fix sein (er sollte nur die abs(Ganzzahl) bilden)
|
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Theoretisch müsste es schneller gehen, die Zahl nacheinander mit (Konstanten!) 10, 100, 1000... zu vergleichen, das ergibt auch so viele Berechnungen wie Stellen, aber in jeder Stufe nur eine Subtraktion statt einer Division. Am besten in Assembler als lineare Folge von Compare und Jump-Befehlen.
also
Delphi-Quellcode:
usw.
.RADIX 10
CMP EAX,10 JNB Next1 RET 1 Next1: CMP EAX,100 JNB Next2 RET 2 Next2: Gruss Reinhard |
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Zitat:
![]() Edit: @Reinhard Kern Daran habe ich auch zuerst gedacht. Dadurch wäre ich aber nicht mehr dynamisch, da ich sämtliche Werte vorgeben muss, was zwar endlich, aus meiner Sicht aber dennoch unschön ist. |
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Zitat:
Gruss Reinhard |
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
[OT]
Zitat:
[/OT] |
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Danke für die Erläuterungen!
|
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Um das ganze mal rein in Delphi zu formulieren:
Delphi-Quellcode:
function GetDecimalFigures(AValue: Integer): Integer;
const POWERSOFTEN: array[0..9] of Integer = (1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000); var lo, hi, mid: Integer; begin lo:=0; hi:=high(POWERSOFTEN); Result:=0; AValue:=abs(AValue); while Result=0 do begin mid:=lo+(hi-lo) div 2; if POWERSOFTEN[mid]<AValue then lo:=mid+1 else if POWERSOFTEN[mid]>AValue then hi:=mid-1 else begin Result:=mid+1; end; if lo>=hi then Result:=hi+1; end; end; Das ganze benutzt - wie vorher vorgeschlagen - ein Konstantenarray, dazu binäre Suche. |
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Zitat:
log 300 / log 10 --> 2.478 --> int 2 log 500 / log 10 --> 2.699 --> int 3 wie viele stellen hat denn nun die 3 stellige zahl? 2 oder 3... oder nach dem kollegen 3 oder 4??? :gruebel: :gruebel: |
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Zitat:
Delphi-Quellcode:
function GetIntLength(const Zahl: integer; Count: integer): integer;
var tmp: integer; begin tmp := zahl div 10; if tmp>0 then result := GetIntLength(tmp, count + 1) else result := count + 1; end; |
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Das ist vielleicht eleganter, aber auch langsamer, da es ein divs benutzt. ;)
|
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
hast recht, bei 100000 aufrufen einer 10 stelligen zahl stellt sich das wie folgt dar...
Zitat:
|
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Ich rede hier nicht davon, ob es extrem langsamer ist, es geht um Optimierungen allgemein. Außerdem ist auf solche Messungen kein Verlass, sie hängen stark von den Software- und Hardwareumständen ab.
|
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
im rahmen der optimierung und der pflegbarkeit, würd ich jedoch den rekursiven algo. vorziehen... (a) ist er nicht grad langsamer und (b) sehr viel übersichtlicher und daher (c) leichter zu pflegen und (d) zu verstehen. j4m2c
|
Re: Aus wievielen Ziffern besteht meine Ganzzahl??
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 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