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

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

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

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

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

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

Что я делаю неправильно? Благодарю.

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

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

 -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 double, и это должно сработать.