Forum: Programmieren allgemein
Delphi
by gammatester,
26. Okt 2009
Das macht die Sache einerseits leichter, aber auch undurchsichtiger. Wenn alles Integerwerte wären, hätten man fast einen Einzeiler:
function IsPowerofN(x,n: int64): boolean;
{-true wenn x>0, n>1 und x eine Potenz von n; sonst false}
begin
if (x>0) and (n>1) then begin
while x mod n = 0 do x := x div n;
IsPowerofN := x=1;
end
else IsPowerofN := false;
Forum: Programmieren allgemein
Delphi
by gammatester,
26. Okt 2009
Hinweis: Wolfgang Mix hat am 25.10.2009 den ersten Beitrag editiert und soweit ich beurteilen kann, folgendes eingefügt:
Nun kann man geteilter Meinung sein, ob in 2^7 = 128 irgendeine Zahl groß ist (geschweige denn sehr groß), aber das ist ja nur einer von vielen Fehlern. Der aktuelle Code aus dem ersten Beitrag liefert: IsPowerOfX(0.5,2) = true, was ja auch richtig ist, da 0.5 = 2^(-1)....
Forum: Programmieren allgemein
Delphi
by gammatester,
24. Okt 2009
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...
Forum: Programmieren allgemein
Delphi
by gammatester,
23. Okt 2009
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 :)
IsZero(a) := abs(a) <= (type)Resolution mit
ExtendedResolution = 1E-19 * FuzzFactor;
DoubleResolution ...
Forum: Programmieren allgemein
Delphi
by gammatester,
23. Okt 2009
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
IsPrimePower(n: int64): boolean;
IsPower(n: int64): boolean;
...
Forum: Programmieren allgemein
Delphi
by gammatester,
23. Okt 2009
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...
Forum: Programmieren allgemein
Delphi
by gammatester,
23. Okt 2009
???
Hast Du grad keine Delphi zur Hand? ln(0.5) = -0.6931471805599453094172321215!
Forum: Programmieren allgemein
Delphi
by gammatester,
23. Okt 2009
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.
function IsPowerOfX(base, number: double): boolean;
begin
result := abs(frac(lgx(base, number))) < 1e-9;
end;