Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi IsPowerOfN (https://www.delphipraxis.net/142189-ispowerofn.html)

nailor 24. Okt 2009 11:51

Re: IsPowerOfN
 
wenn es um integer geht, dann sollte der richtige ansatz[tm] sein:

iterativ solange alle potenzen der basis berechnen, bis man entweder den zielwert trifft, größer wird als der zielwert oder einen overflow erzeugt. treffer bedeutet dabei, dass es eine potenz ist, die beiden anderen fälle, dass es keine potenz ist.

spezielle basen wie negative, null und eins sollte man dabei aussortieren, bevor man anfängt. für andere basen terminiert das ganze nach höchstens 32 bis 64 schritten, weil 2^32 bzw 2^64 die größten integer-werte darstellen.

das ganze ist unglaublich präzise, da mit integern gerechnet wird. darüber hinaus ist es relativ schnell, wenn von einem "normalen mix" von basen und zielwerten ausgegangen werden kann, da nur integer multipliziert, verglichen und gesprungen wird. alles operationen die billig und exakt sind verglichen mit allem was nur nach fließkomma, division oder logarithmus klingt.

meine bescheidene meinung.

wenn fließkomma unterstützt werden soll, sieht die sache anders aus (und deutlich schlechter/komplizierter) da müsste man nochmal sehr gründlich drüber nachdenken, ich verkneife mir hier eine prognose...

also: worum gehts genau?

gammatester 26. Okt 2009 15:36

Re: IsPowerOfN
 
Hinweis: Wolfgang Mix hat am 25.10.2009 den ersten Beitrag editiert und soweit ich beurteilen kann, folgendes eingefügt:
Zitat:

Anmerkung: Bei sehr großen Zahlen werden fehlerhafte Werte zurückgegeben.
Nun kann man geteilter Meinung sein, ob in 2^7 = 128 irgendeine Zahl groß ist (geschweige denn sehr groß), aber das ist ja nur einer von vielen Fehlern. Der aktuelle Code aus dem ersten Beitrag liefert: IsPowerOfX(0.5,2) = true, was ja auch richtig ist, da 0.5 = 2^(-1). Allerdings ist auch IsPowerOfX(0.51,2) = true und wie weiterhin schon bemerkt, IsPowerOfX(x,2) = true für alle 0<x<1, dies als Folge des fehlenden abs.

Solange diese und andere Fehler nicht beseitigt sind, kann man nur dringend von der Benutzung dieses Codelibrary-Beitragskandidaten abraten.

Wolfgang Mix 26. Okt 2009 17:35

Re: IsPowerOfN
 
Lieber gammatester, lieber alzaimar,

ich habe vergessen zu erwähnen, daß ich nur mit ganzen Zahlen >=1 getestet habe.
Das werde ich noch reparieren.

Des öfteren möchte man testen, ob eine [Edit] ganze [/Edit ]Zahl eine Potenz von n (>=1) ist, zb. 1,3,9,27,81,243

Zu Deinem Einwand mit 2^7 komme ich zu folgenden Ergebnissen, die von Deinen abweichen.
Hier mein Testcode für 2^1 .. 2^128

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var base,number,test:double;
    i:integer;
begin
   for i:= 1 to 128 do
   begin
       number:=power(2,i);
       Memo1.Lines.Add(BoolToStr(IsPowerOfx(2,number)));
   end;
   Memo1.Lines.Add(BoolToStr(IsPowerOfx(2,129)));
end;
Alle Werte liefern true bis auf den letzten, was auch richtig ist.

Wenn ich nicht sofurt auf Deine Einwände reagiere, hat das nichts mit Ignoranz zu tun,
denn ich muß gerade einen Trauerfall in meiner Familie abwickeln und bitte daher um
Veständnis.

Liebe Grüße

Wolfgang

jbaertle 26. Okt 2009 19:13

Re: IsPowerOfN
 
OT: Jetzt habe ich beim ersten Lesen doch echt kurz gedacht, hier geht es um die Funktion IsPowerOn...

Medium 26. Okt 2009 19:21

Re: IsPowerOfN
 
Hatte ich auch beim ersten und zweiten Mal hingucken - mein spontaner Gedanke war in etwa: "Viel code kann's ja nich sein" :lol:

himitsu 26. Okt 2009 19:23

Re: IsPowerOfN
 
[OT]
Delphi-Quellcode:
function IsPowerOn: Boolean;
begin
  Result := True;
end;

function IsPowerOff: Boolean;
begin
  Result := False;
end;
Tschutschung, aber ich konnte nicht anders :duck:
[/OT]

Wolfgang Mix 26. Okt 2009 19:27

Re: IsPowerOfN
 
Genial :-D

Medium 26. Okt 2009 19:50

Re: IsPowerOfN
 
Jetzt noch eine "IsInSleepMode()" Methode! :love:


Hey... genuch OT nu *selfslap*

gammatester 26. Okt 2009 21:31

Re: IsPowerOfN
 
Zitat:

Zitat von Wolfgang Mix
Lieber gammatester, lieber alzaimar,

ich habe vergessen zu erwähnen, daß ich nur mit ganzen Zahlen >=1 getestet habe.
Das werde ich noch reparieren.
...
Wolfgang

Das macht die Sache einerseits leichter, aber auch undurchsichtiger. Wenn alles Integerwerte wären, hätten man fast einen Einzeiler:
Delphi-Quellcode:
function IsPowerofN(x,n: int64): boolean;
  {-true wenn x>0, n>1 und x eine Potenz von n; sonst false}
begin
  if (x>0) and (n>1) then begin
    while x mod n = 0 do x := x div n;
    IsPowerofN := x=1;
  end
  else IsPowerofN := false;
end;
Das Prinzip: solange x durch n teilbar ohne Rest teilbar ist, setze x = x div n. Das ursprüngliche x war eine Potenz von n, wenn 1 überbleibt.

Sobald man Fließkommazahlen/-funktionen ins Spiel bringt, tauchen die Probleme wieder auf (in meiner Tabelle oben wären x,n integer und nur die Funktion rechnet intern mit extended).

Bist Du übrigens sicher, daß Du meinst, was Du geschrieben hast?

Da hast eine GANZE Zahl x und willst wissen, ob sie eine (ganzzahlige?) Potenz von einer reellen Zahl n > =1 ist? Zumindest die Variablennamen würde es eher anders herum vermuten lassen.

Wenn Du jetzt IsPowerOfX(2, Power(2,i)) = true hast, must Du eine andere Testfunktion als ln(x)/ln(n) verwenden. Wie sieht's denn mit dem zweiten Teil meiner Tabelle aus?


-------
Edit: Sehe gerade, daß n>1 sein muß in IsPowerofN, sonst gibt's eine Endlosschleife. Potenzen von 1 sind ja auch relativ uninteressant :)

DP-Maintenance 26. Okt 2009 22:02

DP-Maintenance
 
Dieses Thema wurde von "alzaimar" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Programmieren allgemein" verschoben.
Grundsätzlich sollten Methoden und Algorithmen für unsere Codelibrary einen Mehrwert zur einschlägig bekannten Schulmathematik bieten, nicht in der bei Delphi mitgelieferten Library enthalten sein und vor allen Dingen sowohl allgemeingültig als auch fehlerfrei sein. Dies scheint hier nicht gegeben


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 Uhr.
Seite 3 von 3     123   

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