![]() |
Re: IsPowerOfN
Zeigt doch 'mal bitte Eure Profi-Version,
dürfte auch andere interessieren. MFG Wolfgang |
Re: IsPowerOfN
Zitat:
IsPowerOfN ist mE überflüssig, weil sie in der Praxis eigentlich keiner braucht. Was gebraucht wird, sind Funktionen wie
Delphi-Quellcode:
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.
IsPrimePower(n: int64): boolean;
IsPower(n: int64): boolean; 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; |
Re: IsPowerOfN
Zitat:
Delphi-Quellcode:
Aja, und Du bist sicher, daß das mit der Null (IsZero) wirklich funktioniert?
function IsPowerOfX(base, number: double): boolean;
begin result := IsZero(abs(frac(logn(base, number))); end; 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 |
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:
Zitat:
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: |
Re: IsPowerOfN
Zitat:
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:
|
Re: IsPowerOfN
Willkommen in der freundlichen Community rund um Embarcaderos/CodeGears Entwicklertool "Delphi"
In diesem Sinn sei gegrüßt Wolfgang |
Re: IsPowerOfN
Tjaja, Hilfsbereitschaft und Kritikfähigkeit kommen nicht immer im Kombipack gell? :drunken:
|
Re: IsPowerOfN
Damit kann ich gut leben, bin ja noch lernfähig :-D
|
Re: IsPowerOfN
Zitat:
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? |
Re: IsPowerOfN
Zitat:
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:
und die Ergebnisse
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.
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. |
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