サイトマップ / C言語講座出入り口総目次目次:数学の関数>円周率の近似値

青い直線

円周率の近似値

青い直線

[構造体のパッディング]←このソース→[三角関数と逆三角関数]

/* 積分を使って円周率の近似値を求める。

半径1の円の面積は円周率になります。そこで、積分でこの面積を求めます。ここでは、直行座標の第1象限の部分の円の面積を求めて4倍します。

sqrt( )

ソースプログラムの作製に入る前に、平方根を求めるライブラリ関数、sqrt( )について説明します。

    #include <math.h>
    double sqrt(double x);

    例:rt = sqrt(x);

    実行結果    戻り値
    成功        平方根

sqrt( )は引数として0以上の double型の浮動小数点数を取り、その平方根を返します。

ソースプログラムの説明

原点に中心がある半径1の円では、円周上の点のx座標とy座標には次の関係があります。

    x * x + y * y = 1

この式を変形すると次の式になります。

    y = sqrt( 1 -  x * x )

xがdx増加すると下記の式になります。

    y2 = sqrt( 1 - ( x + dx ) * ( x + dx ) )

次に示す4つの座標を結ぶと台形ができます。

    ( x, 0 ), ( x, y ), ( x + dx, y2 ), ( x + dx, 0 )

xを0から1 - dxまで増加させながらこの台形の面積を求め、それを順次足し合わせて4倍すれば、円周率の近似値が求められます。dxの値が小さいほど、値は円周率に近づきます。

今回のソースプログラムでは、2重のforループを使い、外側のループが1回まわる度にdxの値を1/10にし、内側のループでその場合の円周率の近似値を求めています。 */

/* ここからソースプログラム */

#include <stdio.h>
#include <math.h>    /* sqrt(  ) で必要 */

void main(void);

void main(void)
{
    short i;
    double  x, y1, y2,  pi;
    double dx = 1.0;     /* 浮動小数点数の初期化には小数点を付ける */

    for (i = 0; i < 5; i++) {

        pi = 0.0;        /* pi と y1 は、ここで初期化する */
        y1 = 1.0;
        dx /= 10;        /* ループを回る度に dx は 1/10 になる */

        for (x = 0.0; x <= 1.0 - dx; x += dx) { 
            y2 = sqrt(1 - (x + dx) * (x + dx));
            pi += (y1 + y2) * dx / 2;        /* 台形の面積を求める */

                        /* 計算で求めた y2 の値を y1 に代入し */
            y1 = y2;    /* 次のループでもう一度使う */
        }
          /* dx と pi の値を表示 */
        printf("dx = %7.5lf\tPi = %10.8lf\n", dx, pi * 4.0);
    }
}

/* ここまでソースプログラム */

/* 当たり前のことですが、dx の値が小さくなる程、計算回数が増加し、時間がかかります。 */

[構造体のパッディング]←このソース→[三角関数と逆三角関数]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:数学の関数>円周率の近似値