функция 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
}