![]() |
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? |
Re: IsPowerOfN
Hinweis: Wolfgang Mix hat am 25.10.2009 den ersten Beitrag editiert und soweit ich beurteilen kann, folgendes eingefügt:
Zitat:
Solange diese und andere Fehler nicht beseitigt sind, kann man nur dringend von der Benutzung dieses Codelibrary-Beitragskandidaten abraten. |
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:
Alle Werte liefern true bis auf den letzten, was auch richtig ist.
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; 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 |
Re: IsPowerOfN
OT: Jetzt habe ich beim ersten Lesen doch echt kurz gedacht, hier geht es um die Funktion IsPowerOn...
|
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:
|
Re: IsPowerOfN
[OT]
Delphi-Quellcode:
Tschutschung, aber ich konnte nicht anders :duck:
function IsPowerOn: Boolean;
begin Result := True; end; function IsPowerOff: Boolean; begin Result := False; end; [/OT] |
Re: IsPowerOfN
Genial :-D
|
Re: IsPowerOfN
Jetzt noch eine "IsInSleepMode()" Methode! :love:
Hey... genuch OT nu *selfslap* |
Re: IsPowerOfN
Zitat:
Delphi-Quellcode:
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.
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; 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
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. |
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