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 2 von 3     12 3      
Benutzerbild von Wolfgang Mix
Wolfgang Mix

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

Re: IsPowerOfN

  Alt 23. Okt 2009, 20:19
Zeigt doch 'mal bitte Eure Profi-Version,
dürfte auch andere interessieren.

MFG

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
 
#12

Re: IsPowerOfN

  Alt 23. Okt 2009, 21:08
Zitat von Wolfgang Mix:
Zeigt doch 'mal bitte Eure Profi-Version,
dürfte auch andere interessieren.

MFG

Wolfgang
Profi-Version von was? Wie schon gesagt, lgx gibt's in math als logn. Das ist vielleicht(?) eine Profi-Version (und nebenbei eine Funktion, die Codegier/E.. im Laufe der Zeit nicht verschlimmbessert hat).

IsPowerOfN ist mE überflüssig, weil sie in der Praxis eigentlich keiner braucht. Was gebraucht wird, sind Funktionen wie
Delphi-Quellcode:
IsPrimePower(n: int64): boolean;
IsPower(n: int64): boolean;
die testen, ob n eine Primzahlpotenz n = p^k oder eine allgemeine Potenz n=m^k ist. Man beachte: Potenz für irgendeine Basis, zB IsPower(6) = false, IsPower(216) = true, IsPrimePower(216) = false. Sowas wird wirklich gebraucht, zB bei Primzahltests.

Wenn man unbedingt will, könnte man zB sowas benutzen
Delphi-Quellcode:
function IsPowerOfX(base, number: double): boolean;
begin
  result := IsZero(abs(frac(logn(base, number)));
end;
  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
 
#13

Re: IsPowerOfN

  Alt 23. Okt 2009, 23:12
Zitat:
Wenn man unbedingt will, könnte man zB sowas benutzen
Delphi-Quellcode:
function IsPowerOfX(base, number: double): boolean;
begin
  result := IsZero(abs(frac(logn(base, number)));
end;
Aja, und Du bist sicher, daß das mit der Null (IsZero) wirklich funktioniert?
Halte ich für ein Gerücht!
Das abs ist überflüssig, da Nachkommastellen immer positiv sind.
Und was soll nun wirklich besser sein?


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
 
#14

Re: IsPowerOfN

  Alt 23. Okt 2009, 23:44
Wolfgang, dein 'Code' wird durch die Verwendung von LogN aus der Math-Unit auf einen 1-Zeiler reduziert. Und dieser Einzeller ist doch nur eine Ausformulierung einer einschlägig bekannten Definition: Ähnlich trivial wie meine ironische 'AddNumbers'-Funktion.

Sie taugt durchaus als Veranschaulichung eines der Grundprinzipien der Programmierung: Ausformulierung einer Problemlösung bzw. Definition. Aber einen Mehrwert stellt es imho nicht dar, denn es steckt keine neue Erkenntnis in dieser einen(!) Zeile.

Muss man wirklich weitere Worte über dieses Highlight kompakter Programmierkunst verlieren?

Zitat von Wolfgang Mix:
Aja, und Du bist sicher, daß das mit der Null (IsZero) wirklich funktioniert?
Jupp.
Zitat von Wolfgang Mix:
Halte ich für ein Gerücht!
Warum? Schau doch einfach nach, wie diese Funktion definiert ist.
Zitat von Wolfgang Mix:
Und was soll nun wirklich besser sein?
Sie definiert nichs redundantes und bewegt sich dadurch weiterhin in einem geschlossenen Kalkül. Bereits definierte und einschlägig bekannte Funktionen zu verwenden ist in Fachkreisen allgemein als guter Programmierstil bekannt: DRY-Prinzip wäre ein Schlagwort, das mir spontan einfällt.

Wenigstens hast Du mit einem Recht: Das 'Abs' ist überflüssig. Auch weil die funktionierende Standardfunktion 'IsZero' ihrerseits 'Abs' aufruft.

Je mehr ich deinen Ausführungen folge, desto weniger verstehe ich deine Signatur.
"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
 
#15

Re: IsPowerOfN

  Alt 23. Okt 2009, 23:44
Zitat von Wolfgang Mix:
Zitat:
Wenn man unbedingt will, könnte man zB sowas benutzen
Delphi-Quellcode:
function IsPowerOfX(base, number: double): boolean;
begin
  result := IsZero(abs(frac(logn(base, number)));
end;
Aja, und Du bist sicher, daß das mit der Null (IsZero) wirklich funktioniert?
Halte ich für ein Gerücht!
Vielleicht solltest Du mal in den Quellcode schauen, ehe Du falsche Vorstellungen in die Welt setzt. IsZero testet nicht gegen 0. Wenn Du keine Quellcode hast, wäre es doch keine Schande, zu fragen was IsZero eigentlich macht - jedenfalls bei Leuten, die sich nicht als perfekt bezeichnen :)
Delphi-Quellcode:
IsZero(a) := abs(a) <= (type)Resolution mit
ExtendedResolution = 1E-19 * FuzzFactor;
DoubleResolution = 1E-15 * FuzzFactor;
SingleResolution = 1E-7 * FuzzFactor;
FuzzFactor = 1000;
Zitat von Wolfgang Mix:
Das abs ist überflüssig, da Nachkommastellen immer positiv sind.
Noch mehr unreflektierter und ungetesteter Blödsinn: z.B. frac(-0.3) = -0.3.
Zitat von Wolfgang Mix:
Und was soll nun wirklich besser sein?
Zeig mir einen Fall, wo's schlechter ist. Wie gesagt: da es in der Praxis kein Schwein interessiert, ist's auch eh egal.
  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
 
#16

Re: IsPowerOfN

  Alt 23. Okt 2009, 23:58
Willkommen in der freundlichen Community rund um Embarcaderos/CodeGears Entwicklertool "Delphi"

In diesem Sinn

sei gegrüßt

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
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#17

Re: IsPowerOfN

  Alt 24. Okt 2009, 00:06
Tjaja, Hilfsbereitschaft und Kritikfähigkeit kommen nicht immer im Kombipack gell?
"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 Wolfgang Mix
Wolfgang Mix

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

Re: IsPowerOfN

  Alt 24. Okt 2009, 00:12
Damit kann ich gut leben, bin ja noch lernfähig
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
 
#19

Re: IsPowerOfN

  Alt 24. Okt 2009, 07:58
Zitat von gammatester:
Noch mehr unreflektierter und ungetesteter Blödsinn...
...es in der Praxis kein Schwein interessiert...
Das ist kein guter Stil und zudem unhöflich, also überflüssig. Es reicht doch vollkommen aus, Fehler in der Argumentation aufzudecken, zumal sie so offensichtlich sind.

Wolfgang, deine Ignoranz bezüglich meiner und anderer Einwände untermauert das Vorurteil vom beratungsresistenden Lehrer, der irrigerweise meint, über jede Kritik erhaben zu sein: Du bist bisher auf keinen einzigen Einwand eingegangen. Das ist beschämend und eines Akademikers unwürdig. Oder solltest Du dich am Ende mit Federn schmücken, die nicht Deine eigenen sind?
"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
 
#20

Re: IsPowerOfN

  Alt 24. Okt 2009, 09:35
Zitat von alzaimar:
Zitat von gammatester:
Noch mehr unreflektierter und ungetesteter Blödsinn...
...es in der Praxis kein Schwein interessiert...
Das ist kein guter Stil und zudem unhöflich, also überflüssig. Es reicht doch vollkommen aus, Fehler in der Argumentation aufzudecken, zumal sie so offensichtlich sind.


Wolfgang, deine Ignoranz bezüglich meiner und anderer Einwände untermauert das Vorurteil vom beratungsresistenden Lehrer, der irrigerweise meint, über jede Kritik erhaben zu sein: Du bist bisher auf keinen einzigen Einwand eingegangen. Das ist beschämend und eines Akademikers unwürdig. Oder solltest Du dich am Ende mit Federn schmücken, die nicht Deine eigenen sind?
OK, nehm ich zurück: Ersetze "Blödsinn" durch "falsche Behauptungen". Bei der anderen Aussage wiederhole ich, was ich in #12 gesagt habe: "IsPowerOfN ist mE überflüssig, weil sie in der Praxis eigentlich keiner braucht."

Leider wird, wie schon angemerkt, auf die eigentlichen Probleme nicht eingegangen: Auch wenn die Fehler in bisherigen Funktionen beseitigt würden, bleiben ernste Schwierigkeiten (und OldGrumpys Bauchweh). Selbst mit den einfachsten (exakten) Zahlen number und base, gibt es falsche Ergebnisse. Ein Problem mit frac ist, das der Test voll daneben geht, sobald logn minimal kleiner als ein Integer ist. Dann ist frac nahe bei 1, es ist völlig egal, ob man mit IsZero oder abs() < epsilon testet. Beispiel zum Finden von solchen Werten

Delphi-Quellcode:
program mixbug;
{$apptype console}
uses math;
var
  a: extended;
  i,j: integer;
  n,b: longint;
begin
  for j:=1 to 2 do begin
    if j=1 then writeln('IsPowerOfN-Fehler mit ln(n)/ln(b)')
    else writeln('IsPowerOfN-Fehler mit math.logn');
    for b:=2 to 50 do begin
      n := b;
      i := 1;
      while n <= MaxLongint div b do begin
        inc(i);
        n := n * b;
        if j=1 then a := ln(n)/ln(b)
        else a := logn(b, n);
        if abs(frac(a)) > 0.5 then begin
          writeln(b:3, n:12, a:15:10, ' ', a-i:20, frac(a):15:10);
        end;
      end;
    end;
  end;
end.
und die Ergebnisse
Code:
IsPowerOfN-Fehler mit ln(n)/ln(b)
 02         128   7.0000000000   -4.33680868994E-0019   1.0000000000
 02       16384  14.0000000000   -8.67361737988E-0019   1.0000000000
 02    33554432  25.0000000000   -1.73472347598E-0018   1.0000000000
 02   268435456  28.0000000000   -1.73472347598E-0018   1.0000000000
 04       16384   7.0000000000   -4.33680868994E-0019   1.0000000000
 04   268435456  14.0000000000   -8.67361737988E-0019   1.0000000000
 07       16807   5.0000000000   -4.33680868994E-0019   1.0000000000
 07      823543   7.0000000000   -4.33680868994E-0019   1.0000000000
 07   282475249  10.0000000000   -8.67361737988E-0019   1.0000000000
 12    35831808   7.0000000000   -4.33680868994E-0019   1.0000000000
 14   105413504   7.0000000000   -4.33680868994E-0019   1.0000000000
 15        3375   3.0000000000   -2.16840434497E-0019   1.0000000000
 15    11390625   6.0000000000   -4.33680868994E-0019   1.0000000000
 16   268435456   7.0000000000   -4.33680868994E-0019   1.0000000000
 33    39135393   5.0000000000   -4.33680868994E-0019   1.0000000000
 35       42875   3.0000000000   -2.16840434497E-0019   1.0000000000
 35  1838265625   6.0000000000   -4.33680868994E-0019   1.0000000000
 41       68921   3.0000000000   -2.16840434497E-0019   1.0000000000
 41   115856201   5.0000000000   -4.33680868994E-0019   1.0000000000
 46   205962976   5.0000000000   -4.33680868994E-0019   1.0000000000
 47      103823   3.0000000000   -2.16840434497E-0019   1.0000000000
 48      110592   3.0000000000   -2.16840434497E-0019   1.0000000000
 49   282475249   5.0000000000   -4.33680868994E-0019   1.0000000000
IsPowerOfN-Fehler mit math.logn
 07      823543   7.0000000000   -4.33680868994E-0019   1.0000000000
 17        4913   3.0000000000   -2.16840434497E-0019   1.0000000000
 17     1419857   5.0000000000   -4.33680868994E-0019   1.0000000000
 17    24137569   6.0000000000   -4.33680868994E-0019   1.0000000000
 17   410338673   7.0000000000   -4.33680868994E-0019   1.0000000000
 34       39304   3.0000000000   -2.16840434497E-0019   1.0000000000
 34    45435424   5.0000000000   -4.33680868994E-0019   1.0000000000
 34  1544804416   6.0000000000   -4.33680868994E-0019   1.0000000000
 35       42875   3.0000000000   -2.16840434497E-0019   1.0000000000
 35  1838265625   6.0000000000   -4.33680868994E-0019   1.0000000000
  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 17:14 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