Функция 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
двойной, и это должно сработать.