+1 Daumen
2,3k Aufrufe

Hallo liebe Coder,

ich soll über das lange Wochenende eine Funktion in C schreiben, die a^n ausrechnet. a ist eine double-Zahl und n ist eine int-Zahl. Wir dürfen nicht die C Standardbibliothek nutzen, d.h. ich muss das mit elementaren C-Operationen schaffen.

Ich kann bereits einfache C-Programme schreiben, aber hier weiß ich nicht so recht, wie das gehen soll.

Danke euch im Voraus für jede Hilfe

Patty

von

1 Antwort

+3 Daumen
 
Beste Antwort

 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.

von

Super Lösung. Die ist richtig schnell und liefert exakte Ergebnisse.

Vielen lieben Dank.

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community