Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

Wolfgang Mix 23. Okt 2009 20:19

Re: IsPowerOfN
 
Zeigt doch 'mal bitte Eure Profi-Version,
dürfte auch andere interessieren.

MFG

Wolfgang

gammatester 23. Okt 2009 21:08

Re: IsPowerOfN
 
Zitat:

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;

Wolfgang Mix 23. Okt 2009 23:12

Re: IsPowerOfN
 
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

alzaimar 23. Okt 2009 23:44

Re: IsPowerOfN
 
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? :roll:

Zitat:

Zitat von Wolfgang Mix
Aja, und Du bist sicher, daß das mit der Null (IsZero) wirklich funktioniert?

Jupp.
Zitat:

Zitat von Wolfgang Mix
Halte ich für ein Gerücht!

Warum? Schau doch einfach nach, wie diese Funktion definiert ist.
Zitat:

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. :stupid:

gammatester 23. Okt 2009 23:44

Re: IsPowerOfN
 
Zitat:

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:

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:

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.

Wolfgang Mix 23. Okt 2009 23:58

Re: IsPowerOfN
 
Willkommen in der freundlichen Community rund um Embarcaderos/CodeGears Entwicklertool "Delphi"

In diesem Sinn

sei gegrüßt

Wolfgang

Medium 24. Okt 2009 00:06

Re: IsPowerOfN
 
Tjaja, Hilfsbereitschaft und Kritikfähigkeit kommen nicht immer im Kombipack gell? :drunken:

Wolfgang Mix 24. Okt 2009 00:12

Re: IsPowerOfN
 
Damit kann ich gut leben, bin ja noch lernfähig :-D

alzaimar 24. Okt 2009 07:58

Re: IsPowerOfN
 
Zitat:

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?

gammatester 24. Okt 2009 09:35

Re: IsPowerOfN
 
Zitat:

Zitat von alzaimar
Zitat:

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 Uhr.
Seite 2 von 3     12 3      

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