Функция pow C отказывается работать с переменной экспонентой


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

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

Попытка компиляции этого кода приводит к ошибке" неопределенная ссылка на `pow'".

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

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

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

5 9

5 ответов:

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

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

-lm

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

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

pow(2.0, 3);
Компилятор понимает, что это выражение вычисляется как константа, и делает простую подстановку. Таким образом, никакая библиотечная функция не должна вызываться.

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

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

Вы должны связать с математической библиотекой:

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

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

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

gcc ... -lm

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

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

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