HOWTO · C

Esponenti in C

Questo articolo introduce come utilizzare le funzioni di esponenziazione in C

In questa pagina

In C, usa pow() da <math.h> per calcolare potenze in virgola mobile e con esponenti negativi. Per un esponente intero non negativo, un ciclo di moltiplicazioni mantiene il risultato come intero. La scelta è importante: pow() restituisce un double, mentre un ciclo con interi può causare overflow nel tipo usato per il risultato.

Come funziona l’elevamento a potenza in C

L’elevamento a potenza consiste nel moltiplicare una base per sé stessa il numero di volte indicato dall’esponente. In 2^3, la base è 2 e l’esponente è 3, quindi il risultato è 8. C non ha un operatore per l’elevamento a potenza: ^ esegue lo XOR bit a bit. In base ai tipi di input e di risultato necessari, puoi usare la funzione della libreria matematica oppure scrivere un ciclo.

La funzione pow(base, exponent) accetta argomenti aritmetici, compresi gli interi, e restituisce un double. Includere <math.h> fornisce la sua dichiarazione. Alcune toolchain, tra cui GCC sui comuni sistemi Unix-like, richiedono di collegare la libreria matematica con -lm; per esempio, puoi compilare con gcc powers.c -o powers -lm.

Usa pow() per le potenze in virgola mobile

Usa pow() quando la base o l’esponente può essere frazionario, quando l’esponente può essere negativo o quando è appropriato ottenere un risultato in virgola mobile. Per esempio, double result = pow(2.0, 3.0); calcola una potenza in virgola mobile. Questa chiamata è mostrata solo come sintassi; un programma completo che la usa deve collegare la libreria matematica se la toolchain lo richiede.

Poiché il risultato è in virgola mobile, anche una risposta matematicamente intera può risentire della rappresentazione e degli arrotondamenti in virgola mobile. Scegli un formato printf adatto alla precisione che vuoi visualizzare. Se la compilazione segnala un riferimento non risolto a pow, verifica i requisiti del compilatore per il collegamento della libreria matematica; con GCC sui comuni sistemi Unix-like, specifica -lm dopo i file sorgente o oggetto, per esempio gcc powers.c -o powers -lm.

Calcola potenze intere non negative con un ciclo

Quando gli input e il risultato desiderato sono interi, un ciclo evita di convertire il risultato in virgola mobile. Inizializza l’accumulatore a 1, quindi moltiplicalo per la base a ogni iterazione corrispondente a un passo dell’esponente.

Questo programma completo calcola 2 elevato alla terza con un ciclo di moltiplicazioni. Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

#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

Inizializzare l’accumulatore a 1 fa sì che con un esponente pari a zero il risultato sia 1, l’elemento neutro della moltiplicazione. Questo ciclo è adatto agli esponenti interi non negativi. Le moltiplicazioni ripetute richiedono un tempo proporzionale all’esponente. Per esponenti più grandi, l’elevamento a potenza per quadrati successivi può ridurre il numero di moltiplicazioni, ma non elimina il limite dell’intervallo rappresentabile dal tipo del risultato.

Scegli l’approccio giusto e considera i limiti

Usa pow() per esponenti frazionari o negativi e ogni volta che un risultato in virgola mobile è accettabile. Per esempio, pow(2.0, -3.0) vale 0.125, perché un esponente negativo rappresenta il reciproco della potenza corrispondente con esponente positivo. Il ciclo con interi descritto sopra non è adatto a questo caso: un risultato intero non può rappresentare un reciproco frazionario.

La larghezza e l’intervallo dei tipi interi dipendono dall’implementazione di C. Un tipo più ampio può ritardare l’overflow, ma non impedirlo. L’aritmetica intera senza segno effettua un riporto modulo uno in più del valore massimo del tipo; l’overflow con segno non è definito come un riporto circolare, quindi non farci affidamento. Se il risultato può superare l’intervallo del tipo scelto, usa una rappresentazione adatta oppure rileva l’overflow prima di moltiplicare. Anche pow() presenta condizioni di dominio e di intervallo per alcuni input: quando sono rilevanti, verifica il comportamento documentato della libreria C.