C言語関係掲示板

過去ログ

No.504.円周率を求めたい

[戻る] [ホームページ]
No.3817

円周率を求めたいです。
投稿者---りょう(2002/12/12 12:29:14)


tan(2*x)=2*tan(x)/(1-tan(x)の2乗)の2倍角の公式

を使い、tan(t)(0<t<π/2)を与えた時、tan(t/2)を関数値とする関数を作り
(tan(t)からtan(t/2)を計算します。tからではありません)

単位円に外接する正多角形の外周の長さの半分を計算すると、正n角形のnを十分大きくすると、円周率が求まる。初期値を4角形(tan(45°)とし、8角形(tan(22.5°))、16角形(tan(11.25°)).....の周囲の長さの半分を求めるプログラムを作成したいです。

まったくわかりません。助けてください。

No.3824

Re:円周率を求めたいです。
投稿者---かずま(2002/12/12 18:24:25)


> .....の周囲の長さの半分を求めるプログラムを作成したいです。
> まったくわかりません。助けてください。

プログラムは、すぐにできたのですが、まったく分からない人に見せても、
理解できないでしょうから、いくつかの質問に答えていただいたあとで、
そのプログラムをお見せしましょう。

問1. tan(45°) の値は?
問2. 二次方程式の解の公式を書いてください。
問2. y = 2*x / (1 - x*x) のとき、x を y の式で表してください。
    ただし、x >0、y >0 とします。
問3. 単位円の半径の値は?
問4. 単位円に外接する正8角形の一辺の長さは、tan(22.5°)の何倍?

No.3850

Re:円周率を求めたいです。
投稿者---りょう(2002/12/13 18:20:54)



>問1. tan(45°) の値は?

 Ans. 1

>問2. 二次方程式の解の公式を書いてください。

 Ans. x=-b±sqrt(b*b-4ac)/2a

>問2. y = 2*x / (1 - x*x) のとき、x を y の式で表してください。
>    ただし、x >0、y >0 とします。
                      
 Ans. わかりません。

>問3. 単位円の半径の値は?

 Ans. 1

>問4. 単位円に外接する正8角形の一辺の長さは、tan(22.5°)の何倍?

 Ans. 8倍

No.3853

Re:円周率を求めたいです。
投稿者---かずま(2002/12/13 20:27:40)


>> 問1. tan(45°) の値は?
> Ans. 1

正解


>> 問2. 二次方程式の解の公式を書いてください。
> Ans. x=-b±sqrt(b*b-4ac)/2a

x = (-b ± sqrt(b*b - 4ac)) / 2a


>> 問2. y = 2*x / (1 - x*x) のとき、x を y の式で表してください。
>>     ただし、x >0、y >0 とします。
> Ans. わかりません。

これがわからないと、もうお手上げです。あきらめてください。
一応、解答を書いておきます。

両辺に (1 - x*x) を掛けて、y * (1 - x*x) = 2*x
移項して整理すると、y*x*x + 2*x - y = 0
これは二次方程式だから、解の公式を使って、
x = (-2 ± sqrt(4 + 4*y*y)) / 2*y
x > 0, y > 0 だから、± の + だけでよくて、分母分子を 2 で割って、
x = (-1 + sqrt(1 + y*y)) / y

x = tan(t/2), y = tan(t) ということです。


>> 問3. 単位円の半径の値は?
> Ans. 1

正解


>> 問4. 単位円に外接する正8角形の一辺の長さは、tan(22.5°)の何倍?
> Ans. 8倍

2倍です。

単位円とそれに外接する正八角形の図を書いてください。
円の中心 O から、正八角形の一辺までの距離は 1 です。
その距離をあらわす線分 OH を書いてください。
O から、正八角形の頂点 A (H のそば)までの線分 OA を書いてください。
∠AOH = 22.5°だから、線分 AH の長さが tan(22.5°)です。
正八角形の一辺の長さは、線分 AH の長さの 2倍です。

ここまで分かれば、プログラムは簡単です。
#include <stdio.h>
#include <math.h>

int main(void)
{
    double  pi, t = 1;  long i;

    for (i = 4; i <= 100000; i *= 2) {
        pi = i * t;
        printf("%6ld: pi=%.15f, %.15f=tan(%.15g)\n", i, pi, t, 180./i);
        t = (sqrt(1 + t*t) - 1) / t;
    }
    return 0;
}
ここから先は、コンピュータ特有の問題です。
正32768角形までは、円周率に近づいているのに、正65536角形で、円周率から
遠ざかっているのはなぜでしょう。これは、宿題とします。
No.3711「情報落ちについて」, No.3810「計算できません」がヒントです。

No.3872

ありがとうございました。
投稿者---りょう(2002/12/14 16:33:22)


</pre>ここから先は、コンピュータ特有の問題です。
>正32768角形までは、円周率に近づいているのに、正65536角形で、円周率から
>遠ざかっているのはなぜでしょう。これは、宿題とします。
>No.3711「情報落ちについて」, No.3810「計算できません」がヒントです。

ありがとうございます。これから、上の宿題を考えたいと思います。