サイトマップ / C言語講座>出入り口>総目次>目次:数学の関数>円周率の近似値
[構造体のパッディング]←このソース→[三角関数と逆三角関数]
半径1の円の面積は円周率になります。そこで、積分でこの面積を求めます。ここでは、直行座標の第1象限の部分の円の面積を求めて4倍します。
ソースプログラムの作製に入る前に、平方根を求めるライブラリ関数、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言語講座−それ自体コンパイルできる教材を使った講座です−