HOWTO · C

Exponenten in C

Dieser Artikel führt in die Verwendung von Potenzierungsfunktionen in C ein

Auf dieser Seite

Verwenden Sie in C pow() aus <math.h> für Gleitkomma-Potenzen und negative Exponenten. Bei einem nichtnegativen ganzzahligen Exponenten kann eine Multiplikationsschleife das Ergebnis als Ganzzahl berechnen. Die Wahl ist wichtig: pow() gibt einen double zurück, während eine ganzzahlige Schleife einen Überlauf des Ergebnistyps verursachen kann.

So funktioniert Potenzieren in C

Beim Potenzieren wird eine Basis mit einem Exponenten potenziert. In 2^3 ist 2 die Basis und 3 der Exponent; das Ergebnis ist 8. C hat keinen Potenzierungsoperator: ^ steht für bitweises XOR. Verwenden Sie je nach benötigten Eingabe- und Ergebnistypen die Funktion aus der Mathematikbibliothek oder schreiben Sie eine Schleife.

Die Funktion pow(base, exponent) akzeptiert arithmetische Argumente, auch Ganzzahlen, und gibt einen double zurück. Durch das Einbinden von <math.h> steht ihre Deklaration zur Verfügung. Bei einigen Toolchains, darunter GCC auf gängigen Unix-ähnlichen Systemen, muss die Mathematikbibliothek mit -lm verknüpft werden. Ein Beispiel: gcc powers.c -o powers -lm.

pow() für Gleitkomma-Potenzen verwenden

Verwenden Sie pow(), wenn die Basis oder der Exponent gebrochen sein kann, wenn der Exponent negativ sein kann oder wenn ein Gleitkommaergebnis geeignet ist. Zum Beispiel berechnet double result = pow(2.0, 3.0); eine Gleitkomma-Potenz. Dieser Aufruf dient nur als Syntaxbeispiel; ein vollständiges Programm damit muss die Mathematikbibliothek verknüpfen, sofern die Toolchain dies verlangt.

Da das Ergebnis ein Gleitkommawert ist, kann auch ein mathematisch ganzzahliges Resultat von Gleitkommadarstellung und Rundung betroffen sein. Wählen Sie für die gewünschte Ausgabegenauigkeit ein passendes printf-Format. Meldet der Build einen nicht aufgelösten Verweis auf pow, prüfen Sie die Anforderungen des Compilers an die Verknüpfung der Mathematikbibliothek. Bei GCC auf gängigen Unix-ähnlichen Systemen steht -lm hinter den Quell- oder Objektdateien, zum Beispiel: gcc powers.c -o powers -lm.

Nichtnegative ganzzahlige Potenzen mit einer Schleife berechnen

Wenn sowohl die Eingaben als auch das gewünschte Ergebnis Ganzzahlen sind, vermeidet eine Schleife die Umwandlung des Ergebnisses in einen Gleitkommawert. Setzen Sie den Akkumulator zunächst auf 1 und multiplizieren Sie ihn dann bei jedem Schleifendurchlauf mit der Basis.

Dieses vollständige Programm berechnet mit einer Multiplikationsschleife 2 hoch 3. Führen Sie das Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

#include <stdio.h>

int main(void) {
    int base = 2;
    int exponent = 3;
    int result = 1;

    for (int i = 0; i < exponent; ++i) {
        result *= base;
    }

    printf("%d raised to the power of %d is %d\n", base, exponent, result);
    return 0;
}
2 raised to the power of 3 is 8

Wenn der Akkumulator mit 1 beginnt, ergibt ein Exponent von null den Wert 1, das neutrale Element der Multiplikation. Diese Schleife ist für nichtnegative ganzzahlige Exponenten vorgesehen. Die wiederholten Multiplikationen benötigen eine Laufzeit, die proportional zum Exponenten ist. Bei größeren Exponenten kann Potenzieren durch Quadrieren die Anzahl der Multiplikationen verringern, begrenzt aber weiterhin der Wertebereich des Ergebnistyps das Ergebnis.

Den passenden Ansatz wählen und Grenzen berücksichtigen

Verwenden Sie pow() für gebrochene oder negative Exponenten sowie immer dann, wenn ein Gleitkommaergebnis akzeptabel ist. Zum Beispiel ist pow(2.0, -3.0) gleich 0,125, denn ein negativer Exponent steht für den Kehrwert der entsprechenden positiven Potenz. Die ganzzahlige Schleife oben eignet sich dafür nicht: Ein ganzzahliges Ergebnis kann keinen gebrochenen Kehrwert darstellen.

Die Breite und Wertebereiche von Ganzzahltypen hängen von der C-Implementierung ab. Ein breiterer Typ kann einen Überlauf hinauszögern, verhindert ihn aber nicht. Bei vorzeichenloser Ganzzahlarithmetik wird modulo dem um eins erhöhten Maximalwert des Typs gerechnet. Ein Überlauf bei vorzeichenbehafteten Ganzzahlen ist kein definiertes Umlaufverhalten; verlassen Sie sich daher nicht darauf. Kann das Ergebnis den Wertebereich des gewählten Typs überschreiten, wählen Sie eine geeignete Darstellung oder erkennen Sie einen Überlauf vor der Multiplikation. Auch für pow() gelten bei manchen Eingaben Domain- und Wertebereichsbedingungen. Schlagen Sie das dokumentierte Verhalten der C-Bibliothek nach, wenn solche Fälle relevant sind.