0

円周率を近似するプログラムを作成しようとしています。基本的に、0.00 から 1.00 の間のランダムなポイントを取り、それらを円の境界と比較します。合計ポイントに対する円内のポイントの比率は pi に近づく必要があります (非常に簡単な説明であり、仕様はさらに詳しく説明されています)。

ただし、gcc でコンパイルすると、次のエラーが発生します。

Undefined                       first referenced
symbol                          in file
pow                             /var/tmp//cc6gSbfE.o
ld: fatal: symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status

これで何が起こっているのですか?このエラーはこれまで見たことがなく、なぜ発生するのかわかりません。これが私のコードです(ただし、エラーを回避できないため、完全にはテストしていません):

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

int main(void) {
    float x, y;
    float coordSquared;
    float coordRoot;
    float ratio;
    int n;
    int count;
    int i;

    printf("Enter number of points: ");
    scanf("%d", &n);

    srand(time(0));

    for (i = 0; i < n; i++) {
        x = rand();
        y = rand();

        coordSquared = pow(x, 2) + pow(y, 2);
        coordRoot = pow(coordSquared, 0.5);

        if ((x < coordRoot) && (y < coordRoot)) {
            count++;
        }
    }

    ratio = count / n;
    ratio = ratio * 4;

    printf("Pi is approximately %f", ratio);

    return 0;
}
4

3 に答える 3

6

-lmコンパイル (またはリンク) 中に使用して、数学ライブラリを含めます。

このような:gcc yourFile.c -o yourfile -lm

于 2012-11-07T05:40:13.257 に答える
3

-lm でリンクする必要があります。gcc test.c -o テスト -lm

于 2012-11-07T05:53:44.250 に答える
2

このエラーは、リンカーによって生成されますld。シンボルpowが見つからないことを示しています (リンカーによって処理されるすべてのオブジェクト ファイルで定義されていません)。pow()解決策は、関数 libm (数学の m)の実装を含むライブラリを含めることです。-lm[1]コンパイラのコマンド ライン呼び出し (すべてのソース ファイルの指定の後に) にスイッチを追加して、これを行います。

gcc -o a.out source.c -lm

[1] 別の方法としてpow()、別の翻訳単位またはライブラリで を独自に実装することもできますが、コンパイラ/リンカーにその場所を伝える必要があります。

于 2012-11-07T05:42:48.267 に答える