AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Aus wievielen Ziffern besteht meine Ganzzahl??
Thema durchsuchen
Ansicht
Themen-Optionen

Aus wievielen Ziffern besteht meine Ganzzahl??

Ein Thema von bingo72 · begonnen am 16. Jan 2008 · letzter Beitrag vom 17. Jan 2008
Antwort Antwort
Seite 2 von 3     12 3      
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#11

Re: Aus wievielen Ziffern besteht meine Ganzzahl??

  Alt 16. Jan 2008, 17:56
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:
        .RADIX 10
        CMP EAX,10
        JNB Next1
        RET 1
Next1: CMP EAX,100
        JNB Next2
        RET 2
Next2:
usw.

Gruss Reinhard
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#12

Re: Aus wievielen Ziffern besteht meine Ganzzahl??

  Alt 16. Jan 2008, 18:16
Zitat von sirius:
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)
Die Zeiten habe ich mit ProDelphi gemessen. Dieses berechnet Durchschnittswerte etc. automatisch.

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.
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#13

Re: Aus wievielen Ziffern besteht meine Ganzzahl??

  Alt 16. Jan 2008, 18:44
Zitat von s-off:
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.
Hallo, das ist meistens so: schnell ist nicht elegant. Mein Vorschlag ist eben gerade deshalb schnell, weil er Konstanten benutzt (also die Stufen vorher berechnet sind) und weil er die Schleife aufrollt - eine übliche Technik zur Geschwindigkeitserhöhung. Das Gegenteil sind rekursive Lösungen - elegant formuliert, aber langsam und mit indiskutabler Stack-Belastung.

Gruss Reinhard
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: Aus wievielen Ziffern besteht meine Ganzzahl??

  Alt 16. Jan 2008, 19:07
[OT]
Zitat von Reinhard Kern:
Das Gegenteil sind rekursive Lösungen - elegant formuliert, aber langsam und mit indiskutabler Stack-Belastung.
Ein Vorurteil aus der SWT-Antike. In der Tat sind rekursive Lösungen nur unwesentlich langsamer als ihr iteratives Pendant. Und eine sinnvolle rekursive Lösung (z.B. Quicksort oder Backtracking) belasten den Stack nur minimal: Die paar Bytes, die jedesmal auf den Stack geschoben werden, machen den Kohl nicht fett)
[/OT]
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#15

Re: Aus wievielen Ziffern besteht meine Ganzzahl??

  Alt 16. Jan 2008, 19:42
Danke für die Erläuterungen!
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: Aus wievielen Ziffern besteht meine Ganzzahl??

  Alt 16. Jan 2008, 19:43
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#17

Re: Aus wievielen Ziffern besteht meine Ganzzahl??

  Alt 16. Jan 2008, 22:33
Zitat von Kroko1999:
ZiffernCount := Int(Abs(ln(Ganzzahl))/ln(10)); [Edit]Formel verbessert
du weisst schon, dass du da immer verschiedene lösungen bekommst...

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???
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#18

Re: Aus wievielen Ziffern besteht meine Ganzzahl??

  Alt 16. Jan 2008, 22:46
Zitat von 3_of_8:
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.
das ganze geht doch auch etwas eleganter ...

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;
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#19

Re: Aus wievielen Ziffern besteht meine Ganzzahl??

  Alt 16. Jan 2008, 22:47
Das ist vielleicht eleganter, aber auch langsamer, da es ein divs benutzt.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#20

Re: Aus wievielen Ziffern besteht meine Ganzzahl??

  Alt 16. Jan 2008, 22:58
hast recht, bei 100000 aufrufen einer 10 stelligen zahl stellt sich das wie folgt dar...

Zitat:
Rekursiv: 5569 Ticks
Interativ: 5387 Ticks
also, schon extrem langsamer ...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:31 Uhr.
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