функция pow в C

Я пишу код C, который имеет функцию питания, которая из математики.H библиотеки. когда я скомпилировал свою программу, я получил ошибку, которая является "неопределенной ссылкой на функцию "pow"", я компилирую свою программу с помощью компилятора gcc (fedora 9).

я вставляю флаг-lm в gcc, тогда ошибка опущена, но выход функции pow равен 0.

#include<math.h>
main()
{
double a = 4, b = 2;
b = pow(b,a);
}

может кто-нибудь помочь мне? Есть ли проблема в моем компиляторе??

спасибо.

4 ответов


ваша программа ничего не выводит.

0, на который вы ссылаетесь, вероятно, является кодом выхода, который будет 0, если вы явно не вернетесь из main.

попробуйте изменить его на подпись, совместимую со стандартами, и вернуть b:

int main(void) {
  ...
  return b;
}

обратите внимание, что возвращаемые значения по существу ограничены 8 битами информации, поэтому очень, очень ограничены.

использовать printf для отображения значения.

#include <stdio.h>
...
  printf("%f\n", b);
...

вы должны используйте спецификатор преобразования с плавающей запятой (f, g или e) для печати double значения. Вы не можете использовать d или другие и ожидают последовательного вывода. (На самом деле это было бы неопределенным поведением.)


для всех остальных, кто ищет такой ответ:

это не будет работать:

gcc my_program.c -o my_program

он произведет что-то вроде этого:

/tmp/cc8li91s.o: In function `main':
my_program.c:(.text+0x2d): undefined reference to `pow'
collect2: ld returned 1 exit status

это будет работать:

gcc my_program.c -o my_program -lm

вам не хватает строки printf для печати значения в stdout. Попробуйте вот это:

#include <stdio.h>
#include <math.h>

int main() {
        double a=4, b=2, c;

        c = pow(b,a);
        printf("%g^%g=%g\n", a,b,c);
        return 0;
}

выход будет:

4^2=16

здесь есть путаница в отношении базы и экспоненты. Это не сразу видно, потому что 2^4 и 4^2 равны 16.

void powQuestion()
{
    double a, b, c;

    a = 4.0;
    b = 2.0;
    c = pow(b, a);

    printf("%g ^ %g = %g\n", a,b,c);        // Output: 4 ^ 2 = 16

    a = 9.0;
    b = 2.0;
    c = pow(b, a);

    printf("%g ^ %g = %g\n", a,b,c);        // Output: 9 ^ 2 = 512  >> Wrong result; 512 should be 81 <<


    // K & R, Second Edition, Fifty Second Printing, p 251: pow(x,y) x to the y

    double x, y, p;

    x = 9.0;
    y = 2.0;
    p = pow(x, y);

    printf("%g ^ %g = %g\n", x, y, p);      // Output: 9 ^ 2 = 81


    // even more explicitly

    double base, exponent, power;

    base = 9.0;
    exponent = 2.0;
    power = pow(base, exponent);

    printf("%g ^ %g = %g\n", base, exponent, power);    // Output: 9 ^ 2 = 81
}