既に言ってあるように、 http://nalab.mind.meiji.ac.jp/~mk/syori2-2011/jouhousyori2-2011-06/node8.htmlで紹介した piarctan.BAS が叩き台になる。 これは、与えられた , に対して、 級数
piarctan.BAS (再掲) |
REM piarctan.BAS --- マーダヴァ・グレゴリー・ライプニッツ級数でπを計算 REM arctan x の級数を第 n 項まで計算 INPUT X INPUT N F=-X*X T=X S=0 FOR J=1 TO N A=T/(2*J-1) S=S+A T=F*T NEXT J PRINT "arctan(x)≒";S PRINT "その4倍";4*S REM 組込み定数 PI との差を計算してみる PRINT USING "πとの差=-%.###^^^^^^";4*S-PI END |
の場合の
は有名であるが、収束は非常に遅い。実際、実験で見た通り、
が成り立つ (1億( )項足して、誤差 -- 桁も合わない)。 どんなにコンピューターが速くても、 桁の精度の値を計算するのは無理である。
しかし、これは の値として、収束ギリギリの を代入するからである (実際、(1) の収束半径は である, 冪級数は収束円の内部では必ず収束するが円周上の点で収束するかどうかは case by case で収束しても「遅い」場合が多い)。 なる に対しては、 (1) の収束はぐっと速くなる。
一番簡単なのは、高校生も知っている に基づく、 を用いることである。
INPUT X を X=1/SQR(3) に変え、 をかけるところを をかけるように変えたものが次のプログラムである (OPTION ARITHMETIC DECIMAL_HIGH にも変えた)。
kadai6b1.BAS |
REM kadai6b1.BAS --- マーダヴァ・グレゴリー・ライプニッツ級数でπを計算 REM arctan(1/√3) の級数を第N項まで計算 OPTION ARITHMETIC decimal_high INPUT N LET X=1/SQR(3) LET F=-X*X LET T=X LET S=0 FOR J=1 TO N LET A=T/(2*J-1) LET S=S+A LET T=F*T NEXT J PRINT "6*arctan(x)≒";6*S REM 組込み定数 PI との差を計算してみる PRINT USING "πとの差=-%.###^^^^^^":6*S-PI END |
最後に PI と比較しているのは、 カンニングであるが (苦笑)、 その結果は次のようになり、 くらいで 桁精度を実現しているようである。
kadai6b1.TXT ( の場合) |
? 210 6*arctan(x)≒ 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798175415515142074668914143478172519579252999001468666117910963800249473594922589558451149412426597243798192135258779349163444188419002776980473968671998254815310845772183661993477117122206330295980300468265032425044971769581966122368923975830190359265260280452439469056239411353322600285365354079198623561329837112540037802583883742612430308012431266108485579200748300447615517051621776071743812297241593061362796460193924590409288715907812776745710640173447366147858476628929330128224069043383756471261001339104089689573643179485746003276589222538648739794448220503879861605852796470434461563725003377966770398821962936563887508996436649003257909678486654464777327912490175223366294675627953729664047127912971230253567836505483256602936448002590856734658997052628800136082809703995747012631975584920533663300884564944271834022542189687366731857503436221868148525708031224234008111518938525225632668655196746 πとの差=-3.939E-0103 |
が増加するにつれて、精度がどのように上がっていくか見るために、 INPUT N をやめて、 全体を
FOR N=10 TO 210 STEP 10 ... NEXT N |
誤差が大体等比数列的に ( に関して指数関数的に?) 0 に収束している様子が 分かる 本当はこういうのはグラフにするのが良い。 ここでは gnuplot (1年生のときに習ったはず) を使ってみたが、 もちろん十進 BASIC で描くのも簡単である。
それでは、要求されていた結果を求めるプログラムを作ろう。 課題2Bでやったように、FOR NEXT で N を大きくして行って、 部分和を計算するプログラムにする。
kadai6b2.BAS |
REM kadai6b2.BAS --- マーダヴァ・グレゴリー・ライプニッツ級数でπを計算 REM arctan(1/√3) の級数を10,20,...,250項まで計算 REM 結果は小数点以下110位まで表示 OPTION ARITHMETIC decimal_high LET FMT$="N=### -%."&REPEAT$("#",110) LET N=250 LET X=1/SQR(3) LET F=-X*X LET T=X LET S=0 FOR J=1 TO N LET A=T/(2*J-1) LET S=S+A LET T=F*T IF MOD(J , 10) =0 THEN PRINT USING fmt$:J,6*S END IF NEXT J REM 組込み定数 PI との差を計算してみる PRINT USING "πとの差=-%.###^^^^^^":PI-6*S END |
結果は次のようになる。
N= 10 3.14159051093808009964275422994425504368823543729459863385301608264097243139275244243408049537664837144194195965 N= 20 3.14159265357140338177371056457791845749708370902558800062450336039110974863967354187227900363909324495379551167 N= 30 3.14159265358979302993126907675698512128890364163387594078160677223250316907504141910094384327780556430672531665 N= 40 3.14159265358979323845998904545815723164682333580898559851810755021711576515774234507828600074005410050567590231 N= 50 3.14159265358979323846264334727215223712766242383933328994947074253583407491260142245980404128750279799354137185 N= 60 3.14159265358979323846264338327899429478611788675967126248193958028428440424653148715465478961463146251880103922 N= 70 3.14159265358979323846264338327950287681011408881114209344980232821142119403271477392517560945005206755050370174 N= 80 3.14159265358979323846264338327950288419705988682105507083891588023987499387955321296887381276928532730590072263 N= 90 3.14159265358979323846264338327950288419716939772598750958858556364736336671762754275139106652717651497248200692 N=100 3.14159265358979323846264338327950288419716939937508067873446993355312916323675359893283010326258393751533470850 N=110 3.14159265358979323846264338327950288419716939937510582058777735023191320405347993715459391151728912750033891584 N=120 3.14159265358979323846264338327950288419716939937510582097493858083854337957828522717360102517299756190923350247 N=130 3.14159265358979323846264338327950288419716939937510582097494459221382757184428319165349115190289161510116917782 N=140 3.14159265358979323846264338327950288419716939937510582097494459230781492806566013451682112808110943615477604646 N=150 3.14159265358979323846264338327950288419716939937510582097494459230781640626284131806763014633707611386690905481 N=160 3.14159265358979323846264338327950288419716939937510582097494459230781640628620862758871391779973144580812870063 N=170 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862212031675396342638517754282 N=180 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803473073620684479093638320 N=190 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534059912106400090011 N=200 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211704355929502943 N=210 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798175415515 N=220 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808014 N=230 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651 N=240 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651 N=250 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651 πとの差= 2.722E-0122
少々字が小さくて見づらいが、 の場合に、 小数点以下 位までの小数表示が一致していることが分かる。 これで小数点以下 位までの値は得られていると考えて良いだろう。
円周率 の小数点以下 位まで |
3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280 34825 34211 70679 82148 08651 |
(要求されていたのは、 位までだったが、 位が `8' で、 四捨五入を考えると微妙なので、 位まで表示しておく。)
100桁の数をそのまま表示されても読みづらいので、 10あるいは5桁ごとにブランクをいれるなどすると親切であろう。 なお、筆者自身はそれを「手で」行ったが、 十進 BASIC にやらせた学生もいた (少し感心しました)。
pi100.BAS 5桁ずつ区切って表示 |
OPTION ARITHMETIC decimal_high LET FMT$="%."&REPEAT$("#",110) LET PI100$=USING$(fmt$,PI) PRINT "3." FOR i=0 TO 20 PRINT mid$(PI100$,i*5+3,5)&" "; IF MOD(i,10)=9 THEN PRINT END if NEXT i END |
pi100.TXT |
3. 14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280 34825 34211 70679 82148 |