Wenn dies Ihr erster Besuch hier ist,
lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen
durch. Sie müssen sich vermutlich registrieren,
bevor Sie Beiträge verfassen können. Klicken Sie oben auf 'Registrieren', um den Registrierungsprozess zu
starten. Sie können auch jetzt schon Beiträge lesen. Suchen Sie sich einfach das Forum aus, das Sie am meisten
interessiert.
<p><font size="1" face="Verdana">Allgemeiner ausgedrückt,
möchtest Du folgendes berechnen</font></p>
<p><font size="1" face="Verdana">y = x<sup><sup>n</sup></sup> Auf
beide Seiten der Gleichung kann jetzt der natürliche Logarithmus
(zur Basis 2) LN angewendet werden</font></p>
<p><font size="1" face="Verdana">ln(y) = n*ln(x) Jetzt wird auf
beide Seiten die Exponential Funktion e (kommt von Euler)
angewendet</font></p>
<p><font size="1" face="Verdana">e<sup><sup>ln(y)</sup></sup> = e<sup><sup>n*ln(x)
</sup></sup>Das tolle daran ist, dass e<sup><sup>ln(y)</sup></sup>=
y ist. Daraus folgt -></font></p>
<p><font size="1" face="Verdana">Da es keinen negativen
Logarithmus einer Zahl gibt, mußt Du darauf achten, dass x nicht
kleiner Null wird.<br>
Hinweis: Wenn Du tatsächlich nur hoch 3 rechnen möchtest, ist
Hagen's Vorschlag bestimmt erheblich schneller.</font></p>
Hallo Bunny, teste mal folgende Funktion
<pre><font size="1" face="Verdana">
Type
EJsPowerBasisExponentNull = class(Exception);
EJsPowerBasisExponentSqrt = class(Exception);
EJsPowerNegBasisExponent = class(Exception);
function JsPower(Basis, Exponent: Extended): Extended;
var
IsExpOdd : Boolean; // Zur Vorzeichenkorrektur wg z.B. -2^3 = -8
_Basis : Extended;
BasisSign : Boolean; // Vorzeichen der Basis + = True / - = False
IntExponent : Integer;
begin
Result:=0.0; // Default Result
_Basis:=Abs(Basis); // Hole den Betrag der Basis
BasisSign:=Basis>=0.0;
IntExponent:=Integer(Trunc(Exponent));
IsExpOdd:=Odd(IntExponent); // Ist der ganzzahlige Teil des Exponenten ungerade ?
If (Exponent=0.0) and (Basis=0.0) then
raise EJsPowerBasisExponentNull.Create('Basis und Exponent sind 0');
If (Basis<0.0) and (Exponent>=0.0) and (Exponent<1) then
raise EJsPowerBasisExponentSqrt.Create('Wurzel aus negativer Zahl ist nicht erlaubt');
If (Not BasisSign{Ist die Basis negativ}) and (Frac(Exponent)<>0.0) then
raise EJsPowerNegBasisExponent.Create('negative Basis darf nur mit ganzzahligem Exponenten potenziert werden');
If Exponent=0.0 then
begin // Etwas hoch 0 ergibt definitionsgemäß immer 1
Result:=1.0;
Exit;
end;
If Exponent<0.0 then
Result :=1/Exp(Abs(Exponent) * Ln(_Basis))
else
begin
Result := Exp(Exponent * Ln(_Basis))
end;
If (Not BasisSign) and(IsExpOdd) then // Vorzeichenkorrektur (-2)^3 = -8
Result:=Result*(-1);
end;
</font></pre>
<br>Ich habe alle Kombinationen aus Basis und Exponent getested, die mir eingefallen sind. Die Funktion verhielt sich wie erwartet. Wenn jemand eine Kombination entdeckt, die einen Fehler, oder eine neue Exception hervorruft, würde mich das interessieren<br>Jens Schuman
Comment