2010-11-13 19 views
33

Dlaczego po trochę pracy kodu w C:Korzystanie pow() funkcja rzuca niezdefiniowany błąd odniesienia w C

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

podczas gdy ten drugi nie?

int a = 2; 
int b = 3; 

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

Nawet jeśli próbuję

double a = 2; 
double b = 3; 

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

dostaję

niezdefiniowana odniesienia do `pow”

Co robię źle?

+0

Kompletny fragment kodu byłoby pomocne ... –

+0

Czy tym math.h czy nie? –

+0

Załączam math.h, yes. Pierwszy fragment kodu działa i wyprowadza to, czego można się spodziewać. Pozostałe dwa podają "niezdefiniowane odniesienie do" pow "". –

Odpowiedz

52

Kiedy to działa, to dlatego, że obliczenia zostały wykonane przez samego kompilatora (i zawarte w binarny tak, jakby napisał go)

printf("8\n"); 

Kiedy to nie działa, dlatego funkcji pow jest zawarty w bibliotece matematycznej, a biblioteka matematyczna nie jest domyślnie połączona z twoim plikiem binarnym.
Aby uzyskać biblioteka matematyczna być połączone, jeśli kompilator gcc, użyj

gcc ... -lm ... 

z innymi kompilatorami, powinna być taka sama :)
ale przeczytać dokumentację

+4

Jesteś na miejscu! GCC używa MPFR. Oto kilka informacji: http://gcc.gnu.org/gcc-4.3/changes.html#mpfropts – swatkat

+0

MPFR! Woh! :) Całkowicie znokautujcie mnie, kiedy próbowałem dokładnie to samo i nie mogę uwierzyć w to, co widziałem. – Deqing

16

undefined reference to 'pow' brzmi jak łącznik błąd. Nie łączysz się z biblioteką matematyczną, nawet jeśli wprowadzasz funkcję pow, włączając w to <math.h>.

Używając gcc, użyj parametru wiersza poleceń -lm do połączenia w bibliotece matematycznej.

+0

-1: identyczna odpowiedź – karthik

+11

Jeśli zauważysz, identyczne odpowiedzi zostały rozłożone <= 1 minutę od siebie. To może wyjaśnić, dlaczego. –

2

Zastosowanie jak to

#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; 
} 

Wyjście:

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

+0

+1 dla przykładu roboczego (nawet jeśli tak naprawdę nie odpowiada na pytanie): Dlaczego w dół? (to nie ja) --- Domyślam się, że ""% lf "" jest nieprawidłowym specyfikatorem konwersji, ale downvoter może być trochę bardziej pomocny – pmg

-5

nieokreślone odniesienie do `pow”

ponieważ moc do dowolnej liczby muszą mieć wartość całkowitą jako moc

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

Wiem, że to jest stare, ale żeby wspomnieć, to nie jest poprawne , pow() przyjmuje dwa podwójne argumenty. ;) – Pascal

Powiązane problemy