web-dev-qa-db-ja.com

Cのpow関数

Math.hライブラリからのパワー関数を持つCコードを記述します。プログラムをコンパイルすると、「pow関数への未定義の参照」というエラーが表示され、gccコンパイラ(Fedora 9)を使用してプログラムをコンパイルしました。

次にgccに-lmフラグを挿入すると、エラーは省略されますが、pow関数の出力は0になります。

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

誰か助けてもらえますか?コンパイラに問題はありますか?

ありがとう。

9
hamb

プログラムは何も出力しません。

参照している0はおそらく終了コードであり、mainから明示的に返さない場合は0になります。

標準に準拠した署名に変更して、bを返します。

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

戻り値は基本的に8ビット分の情報に制限されているため、非常に制限されています。

printfを使用して値を表示します。

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

必須浮動小数点変換指定子(fgまたはe)を使用してdouble値を出力します。 dなどを使用して、一貫した出力を期待することはできません。 (これは実際には未定義の動作です。)

9
Mat

そのような答えを求める他のすべての人のために:

これは機能しません

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
13
goFrendiAsgard

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
4
dAm2K

ここでは、基数と指数に関して混乱があります。 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
}
3
Tom Bernard