Использование функции pow() приводит к ошибке undefined reference в C

Почему следующий фрагмент кода работает на C:

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

а этот другой нет?

int a = 2;
int b = 3;

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

Даже если я попытаюсь

double a = 2;
double b = 3;

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

я получаю

неопределенная ссылка на `pow'

Что я делаю неправильно?


person devoured elysium    schedule 13.11.2010    source источник
comment
Полный фрагмент кода был бы полезен...   -  person Oliver Charlesworth    schedule 13.11.2010
comment
Вы включаете math.h или нет?   -  person Pete Kirkham    schedule 13.11.2010
comment
Я включаю math.h, да. Первый фрагмент кода работает и выводит ожидаемое. Два других дают неопределенную ссылку на «pow».   -  person devoured elysium    schedule 13.11.2010
comment
Вы связываете математическую библиотеку, предоставляя переключатель -lm для gcc/g++?   -  person swatkat    schedule 13.11.2010
comment
В вашем третьем фрагменте кода значения типа double должны иметь после них .0. Итак, double a = 2.0;, а не double a = 2;.   -  person Mateen Ulhaq    schedule 13.11.2010
comment
@muntoo: в этой ситуации .0 избыточен. Нужен он (или приведение), например в 2/3 --- 2/3.0 --- 2/(double)3.   -  person pmg    schedule 14.11.2010
comment
@pmg Тем не менее, это хорошая практика.   -  person Mateen Ulhaq    schedule 14.11.2010
comment
Вы #include пользуетесь такой библиотекой, как math.h?   -  person Michael Dorst    schedule 02.09.2013


Ответы (4)


Когда это работает, это потому, что расчет был сделан самим компилятором (и включен в двоичный файл, как если бы вы его написали)

printf("8\n");

Когда это не работает, это связано с тем, что функция pow включена в математическую библиотеку, а математическая библиотека по умолчанию не связана с вашим двоичным файлом.
Чтобы связать математическую библиотеку, если ваш компилятор gcc, использовать

gcc ... -lm ...

С другими компиляторами должно быть так же :)
но читайте документацию

person pmg    schedule 13.11.2010
comment
Вы на месте! GCC использует MPFR. Вот некоторая информация: gcc.gnu.org/gcc-4.3/changes.html# mpfropts - person swatkat; 13.11.2010
comment
МПФР! Вау! :) Полностью сбил меня с толку, когда я пробовал то же самое и не мог поверить в то, что видел. - person Deqing; 26.08.2014

undefined reference to 'pow' звучит как ошибка компоновщика. Вы не связываетесь с математической библиотекой, даже если вы вводите функцию pow, включая <math.h>.

В gcc используйте параметр командной строки -lm для ссылки на математическую библиотеку.

person eq-    schedule 13.11.2010
comment
Если вы заметили, одинаковые ответы были опубликованы с интервалом ‹= 1 минута. Это может помочь объяснить, почему. - person Lucas; 03.10.2013

Используйте так

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

Вывод:

pow(3.2, 1) = 3.200000

person Karthik Ratnam    schedule 13.11.2010

неопределенная ссылка на `pow'

потому что мощность любого числа должна иметь целочисленное значение как мощность

pow(x,y)
where, x must be real and y must be a whole number
person Javed Akram    schedule 13.11.2010
comment
Я знаю, что это старо, но просто хочу отметить, что это неверно, pow() принимает два двойных аргумента. ;) - person Pascal; 12.04.2012