Функция 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, чтобы включить библиотеку math.
Он работал для жестко заданного значения, потому что компилятор оптимизировал вызов pow.
Вы должны связать с математической библиотекой:
Причина в том, что GCC (и некоторые другие компиляторы) имеют встроенную функциюgcc program.c -lm
pow()
для литеральных констант. Поэтому, если вы вызоветеpow()
с 2.0 вручную, компилятор на самом деле выяснит, что такое ответ, и заменит его для вас. При вводе переменной компилятор должен полагаться на библиотеку math, с которой необходимо установить связь.
Код для
pow
является частью математической библиотеки. Вам нужно связать в этой библиотеке (в дополнение к библиотеке C, которая связана по умолчанию).Для этого с помощью gcc укажите
-lm
в вызове компилятораgcc ... -lm
Http://www.cplusplus.com/reference/clibrary/cmath/pow/
В C существует только версия, принимающая два двойных параметра с этим именем. Остальные перегрузки доступны только в C++.
Похоже, что вы не можете передать int, поэтому просто сделайте
i
double, и это должно сработать.