Pytanie Użycie funkcji pow () powoduje zgłoszenie niezdefiniowanego błędu odniesienia w C


Dlaczego poniższy kod działa w C:

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

a ten drugi nie?

int a = 2;
int b = 3;

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

Nawet jeśli spróbuję

double a = 2;
double b = 3;

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

Dostaję

niezdefiniowane odniesienie do `pow '

Co ja robię źle?


33
2017-11-13 18:35


pochodzenie


Pełny fragment kodu byłby pomocny ... - Oliver Charlesworth
Czy włączasz matematykę czy nie? - Pete Kirkham
Załączam math.h, tak. Pierwszy fragment kodu działa i wyprowadza to, czego można się spodziewać. Pozostałe dwa podają "niezdefiniowane odniesienie do" pow "". - devoured elysium
Czy łączysz bibliotekę matematyczną, wprowadzając przełącznik -lm do gcc / g ++? - swatkat
W trzecim fragmencie kodu wartości podwójne powinny mieć wartość .0 po nich. Więc, double a = 2.0;, nie double a = 2;. - Mateen Ulhaq


Odpowiedzi:


Kiedy to działa, dzieje się tak dlatego, że obliczenia zostały wykonane przez sam kompilator (i zawarty w pliku binarnym tak, jak gdybyś to napisał)

printf("8\n");

Kiedy to nie działa, to dlatego, że pow funkcja jest zawarta w bibliotece matematycznej, a biblioteka matematyczna nie jest domyślnie połączona z twoim plikiem binarnym.
Aby uzyskać bibliotekę matematyczną do połączenia, jeśli twój kompilator to gcc, użyj

gcc ... -lm ...

Z innymi kompilatorami powinno być tak samo :)
ale przeczytaj dokumentację


54
2017-11-13 18:39



Jesteś na miejscu! GCC używa MPFR. Oto kilka informacji: gcc.gnu.org/gcc-4.3/changes.html#mpfropts - swatkat
MPFR! Woh! :) Całkowicie znokautujcie mnie, kiedy próbowałem dokładnie to samo i nie mogę uwierzyć w to, co widziałem. - Deqing


undefined reference to 'pow' brzmi jak błąd łącznika. Nie łączysz w bibliotece matematycznej, nawet jeśli wprowadzasz tę funkcję pow przez uwzględnienie <math.h>.

W gcc użyj -lm parametr wiersza polecenia do połączenia w bibliotece matematycznej.


17
2017-11-13 18:40



-1: identyczna odpowiedź - karthik
Jeśli zauważysz, identyczne odpowiedzi zostały umieszczone <= 1 minutę od siebie. To może wyjaśnić, dlaczego. - Lucas Morgan


Użyj tego w ten sposób

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

Wydajność:

pow (3,2, 1) = 3.200000


2
2017-11-13 18:40



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


niezdefiniowane odniesienie do `pow '

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

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

-5
2017-11-13 18:52



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