+1 Daumen
4,5k Aufrufe

Hallo liebe Coder,

ich soll über das lange Wochenende eine Funktion in C schreiben, die an 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

Avatar 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.

Avatar von

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

Vielen lieben Dank.

Ein anderes Problem?

Stell deine Frage