AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IsPowerOfN

Ein Thema von Wolfgang Mix · begonnen am 23. Okt 2009 · letzter Beitrag vom 26. Okt 2009
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#21

Re: IsPowerOfN

  Alt 24. Okt 2009, 12:51
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?
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#22

Re: IsPowerOfN

  Alt 26. Okt 2009, 16:36
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.
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#23

Re: IsPowerOfN

  Alt 26. Okt 2009, 18:35
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
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
jbaertle

Registriert seit: 2. Mär 2007
Ort: München
20 Beiträge
 
Delphi 7 Professional
 
#24

Re: IsPowerOfN

  Alt 26. Okt 2009, 20:13
OT: Jetzt habe ich beim ersten Lesen doch echt kurz gedacht, hier geht es um die Funktion IsPowerOn...
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#25

Re: IsPowerOfN

  Alt 26. Okt 2009, 20:21
Hatte ich auch beim ersten und zweiten Mal hingucken - mein spontaner Gedanke war in etwa: "Viel code kann's ja nich sein"
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#26

Re: IsPowerOfN

  Alt 26. Okt 2009, 20:23
[OT]
Delphi-Quellcode:
function IsPowerOn: Boolean;
begin
  Result := True;
end;

function IsPowerOff: Boolean;
begin
  Result := False;
end;
Tschutschung, aber ich konnte nicht anders
[/OT]
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#27

Re: IsPowerOfN

  Alt 26. Okt 2009, 20:27
Genial
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#28

Re: IsPowerOfN

  Alt 26. Okt 2009, 20:50
Jetzt noch eine "IsInSleepMode()" Methode!


Hey... genuch OT nu *selfslap*
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#29

Re: IsPowerOfN

  Alt 26. Okt 2009, 22:31
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 :)
  Mit Zitat antworten Zitat
26. Okt 2009, 23:02
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
Antwort Antwort
Seite 3 von 3     123   


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 13:16 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