∫
01√(1 - x
2) dx を台形近似を利用した区分求積法で求めるんですね。
コード:
#include <stdio.h> // scanf, printf
#include <math.h> // sqrt
double f(double x) { return sqrt(1 - x*x); }
int main(void)
{
int n;
while (scanf("%d", &n) == 1) { // n を入力
double x = 0;
double S = 0;
double dx = 1.0 / n; // (1)
while (x < 1) { // ループ開始
double y1 = f(x);
x = x + dx; // (2)
double y2 = f(x);
double ds = (y1 + y2) * dx / 2; // (3)
S = S + ds; // (4)
} // ループ終了
double PI = S * 4;
printf("PI = %g\n", PI); // PI を表示
}
return 0;
}
実行結果
コード:
256 <-- 入力
PI = 3.14131
1024 <-- 入力
PI = 3.14156
4096 <-- 入力
PI = 3.14159
. <-- 入力
このアルゴリズムでは、y1 と y2 を求めるのに
同じ f(x) の計算を 2回行っており、無駄があります。
n が 2のべき乗でないとき、dx は誤差を持ち、
x = x + dx で、x に誤差が蓄積し、
n回ループを回っても、x が 1 にならず、
もう一回余分にループを回る可能性があります。
ということで別解です。
コード:
#include <stdio.h> // scanf, printf
#include <math.h> // sqrt
double f(double x) { return sqrt(1 - x*x); }
int main(void)
{
int n;
while (scanf("%d", &n) == 1) {
double dx = 1.0 / n;
double S = (f(0) + f(1)) / 2;
for (int i = 1; i < n; i++)
S += f(dx * i);
double PI = S * dx * 4;
printf("PI = %g\n", PI);
}
return 0;
}