正多角形で円周率を計算

円に内接する正多角形を用いて円周率を計算します。
円周率の最初の40桁です。
pai= 3.1415 9265 3589 7932 3846 2643 3832 7950 2884 1971

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 私がコンピュータを習い始めたころ FORTRAN で作成したプログラムをベースにC言語に置き換えました。
    今回さらにC言語をC#に置き換えてみました。
    私が考案したと思っていた FORTRAN のプログラムが始めて動いた時は、なかなか面白い画期的な方法が見つかったと思っていたのですが、 何のことは無いコンピュータが開発される以前から同じようなことを考える数学者がいたのですね。 (^_^;
    円周率の話
  2. 半径(R)=1の円の外周は 2лR であり、1/2にすれば円周率が求まります。
  3. いま、円に内接する正6角形から計算を始めることにします。
    正6角形の一辺の長さは半径と同じ1なので「一辺の長さ×辺の数/2」が円周率の近似値になります。
    Pai = 1*6/2 = 3

  4. 正6角形が正12角形になったときの辺の長さを計算することを考えます。
    正6角形の一辺に円の中心から垂線を下します。
    このとき「斜辺=1,底辺=LEN/2」の直角三角形ができます。
    高さ HT はピタゴラスの定理を使って簡単に計算できます。
    HT(三角形の高さ) = SQRT(R**2-(LEN/2)**2) = SQRT(1-(LEN/2)**2)
  5. 正12角形の斜辺(LEN2)も「高さ= 1-HT,底辺= LEN/2」の直角三角形からピタゴラスの定理を使って計算できます。
    LEN2(正12角形の斜辺) = SQRT((LEN/2)**2 + (1-HT)**2))

  6. これを繰り返せば、正24角形, 正48角形, 正96角形・・・と計算を進めることができます。
  7. 私が作成したプログラムの実行結果です。
    そこそこの精度で円周率を求めることができます。 (^_^;
    正多角形=    6   LEN=1                      PAI=3
    正多角形=   12   LEN=0.517638090205041      PAI=3.10582854123025
    正多角形=   24   LEN=0.261052384440103      PAI=3.13262861328124
    正多角形=   48   LEN=0.130806258460286      PAI=3.13935020304687
    正多角形=   96   LEN=0.0654381656435523     PAI=3.14103195089051
    正多角形=  192   LEN=0.0327234632529736     PAI=3.14145247228546
    正多角形=  384   LEN=0.0163622792078743     PAI=3.14155760791186
    正多角形=  768   LEN=0.00818120805246958    PAI=3.14158389214832
    正多角形= 1536   LEN=0.00409061258232819    PAI=3.14159046322805
    正多角形= 3072   LEN=0.00204530736067661    PAI=3.14159210599927
    正多角形= 6144   LEN=0.0010226538140274     PAI=3.14159251669216
    正多角形=12288   LEN=0.000511326923724835   PAI=3.14159261936538
    正多角形=24576   LEN=0.000255663463951309   PAI=3.14159264503369
    正多角形=49152   LEN=0.000127831732236766   PAI=3.14159265145077
    正多角形=98304   LEN=6.39158661510221E-05   PAI=3.14159265305504
    

【ヒント】

  1. 精度を上げて計算できるように、変数は double で宣言して下さい。
    double kaku,len,ht;
  2. 実行結果は見やすいように、カラムを揃えて表示しましょう。
    Console.WriteLine("正多角形={0,6} LEN={1,-20} PAI={2}",kaku,len,len*kaku/2.0);

前田稔(Maeda Minoru)の超初心者のプログラム入門