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 1 von 3  1 23      
Benutzerbild von Wolfgang Mix
Wolfgang Mix

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

IsPowerOfN

  Alt 23. Okt 2009, 14:02
Des öfteren möchte man testen, ob eine ganze Zahl (>=1) eine ganze Potenz von n (>=1) ist,
zb. 1,3,9,27,81,243 für n=3 usw. Die beiden nachfolgenden Funktionen erledigen das.

Anmerkung: Bei sehr großen Zahlen werden fehlerhafte Werte zurückgegeben.


Delphi-Quellcode:
//Wolfgang Mix - Delphi - PRAXiS
function LgX(base, number: Double): Double; //inline;
begin
  if (base <= 0.0) or (number <= 0.0) then
    System.Error(reInvalidOp);
  Result := Ln(number) / Ln(base); //plattformunabhängig
end;

//Wolfgang Mix - Delphi - PRAXiS
function IsPowerOfX(base, number: Double): Boolean;
begin
  Result := Frac(LgX(base, number)) < 1e-9;
end;
Gruß

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
Benutzerbild von himitsu
himitsu

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

Re: IsPowerOfN

  Alt 23. Okt 2009, 14:08
Delphi-Quellcode:
function LgX(base, number: Double): Double; //inline;
begin
  if (base <= 0.0) or (number <= 0.0) then
    System.Error(reInvalidOp);
  Result := Ln(number) / Ln(base);
end;

function IsPowerOfX(base, number: Double): Boolean; //inline;
begin
  Result := Frac(LgX(base, number)) < 1e-9;
end;



Warum ich die Parameterprüfung verschoben hab:
Damit ein einzeln genutztes LgX auch geprüft wird und IsPowerOfX braucht diese nicht, da dort durch LgX gleich mitgeprüft wird,


PS: Das Inline kann man übrigens bei neueren Delphis "aktivieren", dann wird keine eigenständige Funktion erstellt, sondern der Code direkt an Ort und Stelle als Inline-Code eingefügt.
(ältere Versionen kennen den Befehl leider nicht ... drum auskommentiert)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#3

Re: IsPowerOfN

  Alt 23. Okt 2009, 15:21
Habt ihr auch mal getestet ob die Funktion bei sehr großen Zahlen nicht "aus Versehen" ein fälschlich positives Ergebnis liefert? Da bei Fließkommarechnungen immer Unschärfen auftreten, habe ich da etwas Bauchweh mit dem "kleiner 1e-9". Allerdings habe ich mir jetzt nicht die Mühe gemacht, die Grenzen der Wertebereiche der verwendeten Datentypen abzuklopfen. Notfalls müsste man mit Int64 oder BigInt, Div und Modulo arbeiten um sicherzugehen...
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
gammatester

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

Re: IsPowerOfN

  Alt 23. Okt 2009, 18:24
Leider wiedermal ziemlich ungetestet und falsch. Neben OldGrumpys Bedenken, hier ein fetter Bug: Jede Zahl number > 1 ist eine Potenz zu base < 1! Warum? Weil ln(number) > 0 und ln(base) < 0 also lgx(base, number) < 0 < 1e-9. Also ist mindestens ein abs dringend erforderlich.

Delphi-Quellcode:
function IsPowerOfX(base, number: double): boolean;
begin
  result := abs(frac(lgx(base, number))) < 1e-9;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: IsPowerOfN

  Alt 23. Okt 2009, 18:28
sollte das Ergebnis von Ln nicht immer größer als 0 sein, wenn auch der übergebene Wert größer 0 ist?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  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
 
#6

Re: IsPowerOfN

  Alt 23. Okt 2009, 19:20
Nein, Log(1) ist immer exakt Null, zu jeder Basis.

Gruß

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
gammatester

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

Re: IsPowerOfN

  Alt 23. Okt 2009, 19:21
Zitat von himitsu:
sollte das Ergebnis von Ln nicht immer größer als 0 sein, wenn auch der übergebene Wert größer 0 ist?
???
Hast Du grad keine Delphi zur Hand? ln(0.5) = -0.6931471805599453094172321215!
  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
 
#8

Re: IsPowerOfN

  Alt 23. Okt 2009, 19:35
Richtig, unter 1 wird der Logarithmus negativ bis - unendlich,
bei Null crashed es

Gruß

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
alzaimar
(Moderator)

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

Re: IsPowerOfN

  Alt 23. Okt 2009, 20:30
Entschuldigt, aber wo ist der Mehrwert? Das ist Schulmathematik bzw. trivial. Mich erinnert das an die Funktion, die zwei Zahlen addiert:
Delphi-Quellcode:
// Alzaimar - Delphi - PRAXiS
Function AddNumbers (A,B : Extended) : Extended;
Begin
  Result := A + B
End;
Und anstatt LgX sollte/könnte man auch die Funktion LogN aus der Unit Math nehmen. Weiterhin ist mir der Mehrwert der präventiven Prüfung der Parameter ggü. einem einfachen An-die-Wand-fahren-lassen nicht klar bzw. bedarf einer Erklärung: Was passiert, wenn man die Prüfung weglässt?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
gammatester

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

Re: IsPowerOfN

  Alt 23. Okt 2009, 20:50
Zitat von alzaimar:
Entschuldigt, aber wo ist der Mehrwert? Das ist Schulmathematik bzw. trivial.
Zitat von alzaimar:
Und anstatt LgX sollte/könnte man auch die Funktion LogN aus der Unit Math nehmen. Weiterhin ist mir der Mehrwert der präventiven Prüfung der Parameter ggü. einem einfachen An-die-Wand-fahren-lassen nicht klar bzw. bedarf einer Erklärung: Was passiert, wenn man die Prüfung weglässt?
Voll einverstanden. Eine ähnliche Diskussion hatten wir schon im Vorgängerthread zu lgx bzw. logn. Dort hatte ich auch auf math.logn verwiesen, und andere hatten den Nährwert bezweifelt.

Das hält manche allerdings nicht davon ab, völlig triviale matmematische Aussagen in schlechte und falsche Programme umzusetzen.

Wäre ja irgendwo kein Problem, wenn's nicht als Beitrag zu Codelibrary vertrieben würde.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 00:12 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