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

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

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

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

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

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

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

5 ответов


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

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

-lm

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

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

pow(2.0, 3);

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

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


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

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


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

gcc program.c -lm

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


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

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

gcc ... -lm

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

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

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