Функция pow в C отказывается работать с переменным показателем - PullRequest
9 голосов
/ 13 декабря 2010

Допустим, у меня есть следующий фрагмент кода:

int i; double value;
for(i = 0; i < CONSTANT; i++) {
  value = (double)pow(2, i);
}

Попытка скомпилировать этот код приводит к ошибке «неопределенная ссылка на« pow »».

Включение или исключение math.h не имеет значения, поскольку в конечном итоге оно включается.

Повышение 2.0 до жестко запрограммированной степени работает нормально, но все терпит неудачу, если я заменяю показатель степени выражением, которое содержит i.

Что я делаю не так? Спасибо.

Ответы [ 5 ]

16 голосов
/ 13 декабря 2010

Это очень интересное поведение и хороший пример обучения.

Чтобы решить вашу проблему, добавьте

-lm

в командную строку gcc (при условии, что вы используете gcc).Это говорит компилятору ссылаться на математическую библиотеку.

Кажется, что происходит, если вы используете

pow(2.0, 3);

, то компилятор понимает, что это выражение вычисляется как константа,и выполняет простую подстановку.

Таким образом, библиотечная функция не должна вызываться.

3 голосов
/ 13 декабря 2010

Вы должны создать ссылку на математическую библиотеку:

gcc program.c -lm

Причина в том, что GCC (и некоторые другие компиляторы) имеют встроенную функцию pow() для литеральных констант. Поэтому, если вы вызовете pow() с 2.0 вручную, компилятор на самом деле определит ответ и заменит его для вас. При вводе переменной компилятор должен полагаться на математическую библиотеку, с которой вы должны ссылаться.

3 голосов
/ 13 декабря 2010

Вам нужно связать с -lm, чтобы фактически включить библиотеку математики.

Она работала для жестко заданного значения, потому что компилятор оптимизировал вызов pow.

1 голос
/ 13 декабря 2010

Код для pow является частью математической библиотеки.Вам необходимо связать эту библиотеку (в дополнение к библиотеке C, которая по умолчанию включена).

Для этого с помощью gcc укажите -lm в вызове компилятора

gcc ... -lm
0 голосов
/ 13 декабря 2010

http://www.cplusplus.com/reference/clibrary/cmath/pow/

В C только версия с двумя двойными параметрами существует с этим именем. Другие перегрузки доступны только в C ++.

Похоже, вы не можете передать int, поэтому просто сделайте i двойным, и это должно сработать.

...