Aloha :)
Ich schreibe zunächst eine mögliche Implementierung auf, danach beschreibe ich, wie sie funktioniert.
01 double power( double a, int n ) {
02 if (n<=0) { a=1.0/a; n=-n; }
03 double p= 1.0;
04 while(n) {
05 if (n&1) p*= a;
06 n>>= 1;
07 a*= a;
08 }
09 return p;
10 }
Zeile 01: Die zu potenzierende Zahl \(a\) und der Exponent \(n\) werden als Parameter übernommen.
Zeile 02: Ein negativer Exponent bedeutet, dass der Kehrwert zu nehmen ist. In diesem Fall wird der Variablen \(a\) ihr Kehrwert \(1.0/a\) zugewiesen und mit positivem Exponenten \(n\) weiter gerechnet. ACHTUNG: Hier kann ein Fehler auftreten! Wenn \(a=0\) und \(n\le0\) sein sollte, ist \(a^n\) mathematisch nicht definiert. Daher wird bei der Anweisung
a=1.0/a;
ein Laufzeit-Fehler erzeugt. Wie das Programm darauf reagiert ist Compiler-abhängig. Willst du diesen Fehler abfangen, kannst du vor Zeile 02 eine passende Fehlerbehandlung einfügen:
if (0.0==a && n<=0) {
//Deine Fehlerbehandlung hier
}
Zeile 03: In der Variablen p bauen wir die Potenz bzw. das Ergebnis auf, sie wird mit \(1.0\) initialisiert.
Zeile 04: So lange der Exponent \(n\) ungleich \(0\) ist, wiederholen wir folgende Schritte.
Zeile 05: Wenn \(n\) ungerade ist, multiplizieren wir unser bisheriges Ergebnis \(p\) mit \(a\).
Zeile 06: Der Exponent \(n\) wird halbiert.
Zeile 07: Der Wert von \(a\) wird quadriert.
Zeile 08: Hier endet die Schleife, sobald n den Wert \(0\) erreicht hat.
Zeile 09: Wir liefern das Ergebnis p zurück.