2010-11-13 6 views
33

Perché la seguente po 'di lavoro di codice in C:Utilizzando pow() la funzione genera un errore di riferimento definito in C

int res = pow(2, 3); 
printf("%d\n", res); 

mentre questo altro no?

int a = 2; 
int b = 3; 

int res = pow(a, b); 
printf("%d\n", res); 

Anche se provo

double a = 2; 
double b = 3; 

double res = pow(a, b); 
printf("%f\n", res); 

ottengo una

undefined reference to `pow'

Che cosa sto facendo di sbagliato?

+0

Un frammento di codice completo sarebbe utile ... –

+0

State compresi math.h o no? –

+0

Sto includendo math.h, si. Il primo frammento di codice funziona e genera ciò che ci si aspetta. Gli altri due danno il "riferimento non definito a 'pow'". –

risposta

52

Quando funziona, è perché il calcolo è stato fatto dal compilatore stesso (e inclusa nel binario come se hai scritto fuori)

printf("8\n"); 

Quando non funziona, è perché la funzione pow è incluso nella libreria matematica e la libreria matematica non è collegata al tuo binario per impostazione predefinita.
Per ottenere la libreria matematica per essere collegato, se il compilatore gcc è, usare

gcc ... -lm ... 

Con altri compilatori, dovrebbe essere lo stesso :)
ma leggere la documentazione

+4

Sei perfetto! GCC usa MPFR. Ecco alcune informazioni: http://gcc.gnu.org/gcc-4.3/changes.html#mpfropts – swatkat

+0

MPFR! Woh! :) Totalmente buttami fuori quando stavo cercando esattamente la stessa cosa e non posso credere a quello che ho visto. – Deqing

16

undefined reference to 'pow' suona come un linker errore. Non stai collegando la libreria matematica, anche se introduci la funzione pow includendo <math.h>.

Con gcc, utilizzare il parametro -lm per il collegamento nella lib di matematica.

+0

-1: risposta identica – karthik

+11

Se si nota, le risposte identiche sono state pubblicate <= 1 minuto di distanza. Questo potrebbe aiutare a spiegare perché. –

2

Usa come questo

#include <math.h> 
#include <stdio.h> 

int main(void) 
{ 
    for(int i = 1; i < 5; i++) 
    printf("pow(3.2, %d) = %lf\n", i, pow(3.2, i)); 
    return 0; 
} 

uscita:

pow (3,2, 1) = 3,200000

+0

+1 per l'esempio di lavoro (anche se in realtà non risponde alla domanda): Perché il downvote? (non ero io) --- Immagino perché '"% lf"' è un identificatore di conversione non valido, ma il downfer potrebbe essere un po 'più utile – pmg

-5

undefined reference to `pow'

perché il potere a qualsiasi numero deve avere un valore intero come il potere

pow(x,y) 
where, x must be real and y must be a whole number 
+0

So che questo è vecchio, ma per dirlo, questo non è corretto , pow() prende due doppi argomenti. ;) – Pascal

Problemi correlati