Math.hライブラリからのパワー関数を持つCコードを記述します。プログラムをコンパイルすると、「pow関数への未定義の参照」というエラーが表示され、gccコンパイラ(Fedora 9)を使用してプログラムをコンパイルしました。
次にgccに-lmフラグを挿入すると、エラーは省略されますが、pow関数の出力は0になります。
#include<math.h>
main()
{
double a = 4, b = 2;
b = pow(b,a);
}
誰か助けてもらえますか?コンパイラに問題はありますか?
ありがとう。
プログラムは何も出力しません。
参照している0はおそらく終了コードであり、main
から明示的に返さない場合は0になります。
標準に準拠した署名に変更して、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
Stdoutに値を出力するためのprintf行がありません。これを試してください:
#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
}