Thema: Delphi IsPowerOfN

Einzelnen Beitrag anzeigen

gammatester

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

Re: IsPowerOfN

  Alt 24. Okt 2009, 10: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