memo369 : WP-1029

Created Fri Oct 29 10:51:01 2010
Last Modified Tue Nov 2 13:48:41 2010

*#1 Fri Oct 29 10:51:01 2010 / Tue Nov 2 13:48:41 2010


memo370 Forward <= Today => Previous memo368

*2GBで終了のお知らせ
-rw-rw-r--    1 nebula   nebula   2147483647 10·î 29 10:32 0042.rdf

*#2 Fri Oct 29 19:25:32 2010 / Sun Oct 31 13:48:31 2010

半径1の円に内接•外接する正2^N角形の面積を用いて円周率を計算する(取り尽くし法)。

半径1の円に内接する正2^N角形の一辺長をL[N]、中心から辺中点までの長さをA[N]とすると、

L[2]   = √2
A[2]   = 1/√2

L[N]^2 = (L[N-1]/2)^2 + (1-A[N-1])^2
A[N]^2 = 1 - (L[N]/2)^2

また、半径1の円に外接する正2^N角形の一辺長をL[N]、中心から頂点までの長さをA[N]とすると、

L[2]   = 2
A[2]   = √2

L[N]   = L[N-1]/2 - 2*(A[N-1]-1)^2/L[N-1]
A[N]^2 = 1 + (L[N]/2)^2

がそれぞれ成り立つ。

そして定義より、
内接の場合
lim[N→∞] 2^N*L[N]*A[N]/2 = π.

外接の場合は
lim[N→∞] 2^N*L[N]/2 = π.

実装例
-------------
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846264338327950288L

int main(){
  long double S  = 0;
  long double Sn = 0;
  long double S2 = 0;
  long double Sn2= 0;
  int    N = 100;
  long double L , A ;
  long double L2, A2;

  L = sqrtl(2.);
  A = L / 2;

  L2= 2.L;
  A2= L2/sqrtl(2);

  int i=0;
  for(i=2; i<N; ++i){
    Sn  = L*A/2;
    S   = Sn  * powl(2.L, i);

    Sn2 = L2/2;
    S2  = Sn2 * powl(2, i);
    printf("%2d, "    , i );
    printf("%1.34Lf, ", S );
    printf("%1.34Lf, ", S2);
    printf("\n");

    L  = sqrtl(powl(L/2, 2.L) + powl(1-A, 2.L) );
    A  = sqrtl(1-powl(L/2, 2.L));

    L2 = L2/2 - 2*powl(A2-1, 2.L)/L2;
    A2 = sqrtl(1+powl(L2/2, 2.L));
  }
}
---------------------------

演習室の環境では30桁あまりの有効数字を確認したが、研究室(xe)の環境では18桁程度に留まった。
精度差の要因はおそらくCPUの違い。演習室のMacはCPUがPowerPC 970(->POWER)で、xeはPentium4(->IA-32).
参考:[LINK]

出力
---
 2, 1.99999999999999999989157978275145, 4.00000000000000000000000000000000,
 3, 2.82842712474619009752757614606367, 3.31370849898476039011030458425466,
 4, 3.06146745892071817378606024551146, 3.18259787807452811016911686792241,
 5, 3.12144515225805228527712620323342, 3.15172490742925609811739273702358,
 6, 3.13654849054593926364550848795432, 3.14411838524590426234041340425307,
 7, 3.14033115695475291244409543622851, 3.14222362994245684505306703826477,
 8, 3.14127725093277286811180304404445, 3.14175036916896645885870220649139,
 9, 3.14151380114430107612366604996623, 3.14163208070318180557649323514369,
10, 3.14157294036709138396364082712608, 3.14160251025680894651492813807181,
11, 3.14158772527715970056781669139667, 3.14159511774958905027700650780531,
12, 3.14159142151119997370470326991665, 3.14159326962930731080674007227316,
13, 3.14159234557011774239231038929887, 3.14159280759964457661360948126372,
14, 3.14159257658487266564630024934246, 3.14159269209225437452688567407932,
15, 3.14159263433856298904436887831082, 3.14159266321540841648135566899214,
16, 3.14159264877698566936943536109794, 3.14159265599619702633710227601682,
17, 3.14159265238659134579328469083492, 3.14159265419139418508941152818892,
18, 3.14159265328899276544134810951192, 3.14159265374019347504853938435332,
19, 3.14159265351459312024494374693262, 3.14159265362739329786358200014007,
20, 3.14159265357099320883742243903924, 3.14159265359919325335050221958966,
21, 3.14159265358509323120238254656300, 3.14159265359214324238486260032488,
22, 3.14159265358861823657678213894684, 3.14159265359038073969766280413296,
23, 3.14159265358949948781196181979425, 3.14159265358994011429691339820636,
24, 3.14159265358971980094601739175175, 3.14159265358982995805514626397326,
25, 3.14159265358977487906690095886830, 3.14159265358980241910312469766353,
26, 3.14159265358978864886817239376882, 3.14159265358979553420248898021327,
27, 3.14159265358979209121007003524539, 3.14159265358979381313996037672354,
28, 3.14159265358979295163291411974171, 3.14159265358979338314537876897248,
29, 3.14159265358979316695546557536289, 3.14159265358979327580936369290754,
30, 3.14159265358979322073189333064391, 3.14159265358979324892114981526703,
31, 3.14159265358979323395915983496707, 3.14159265358979324241593678035400,
32, 3.14159265358979323742860678692068, 3.14159265358979324068121330437720,
33, 3.14159265358979323829596852490909, 3.14159265358979324046437286988009,
34, 3.14159265358979323829596852490909, 3.14159265358979324046437286988009,
35, 3.14159265358979323872964939390329, 3.14159265358979324046437286988009,
36, 3.14159265358979323872964939390329, 3.14159265358979324046437286988009,


*Linked from: