演算精度その2

単純に整数の逆数を足し込んでいくだけのライプニッツ級数は収束が遅いことがわかりました。なので、べき乗項の有るオイラー級数だったらどうなのかをさっそくテスト。大して計算式に変化はありませんのでちょいちょいと変更してコンパイル。

#include <stdio.h>
#include <quadmath.h>
#include <math.h>

void main(void)
{
    char    c1[80];
    long    loop;
    __float128  res=0.0Q,r1=1.0Q;
    
    for (loop=1;loop<100000000;loop++) {
        res=res+1.0Q/(r1*r1);
        r1=r1+2.0Q;
    };
    res=sqrtq(res*8.0Q);
    quadmath_snprintf(c1,sizeof(c1),"%.40Qf",res);
    printf("loop=%ld\tresult=%s\n",loop,c1);
}

結果は、
$ gcc -o paicalc2.o paicalc2.c -lquadmath
$ ./paicalc2.o
 loop=10000000 result=3.1415926217588012757267165560912027187844
$ ./paicalc2.o
 loop=100000000 result=3.1415926504066943431811710021935384220221

と言う訳でライプニッツ級数の1億項の計算に比べて1000万項の計算で1桁精度が向上しました。項数を同じにした場合は2桁の向上ですね。でもそんなものか…

実際にはその後いろんな方法が考案されていて、そちらを使えばってのが身も蓋もない言い方。実際ガウス・ルジャンドル法だと3回目には18桁正しい値が得られるし、昨今の多数桁計算にはマーチンの式が使用されている。
とは言え、今から300年前に手計算だけでこれにたどり着いたのだからすごいことだと思うな。

「演算精度その2」への2件のフィードバック

  1. jamanoさん 鮮やかなものですね。
    日本の関孝和(群馬の人 江戸時代初期)は手計算で円周率17桁くらい計算したみたいですね、計算機も無い時代にどうやったのでしょうね。
    そろばんは、もうあったのかな。
    この時代は、円と三角形の組み合わせで、あくまで図形から解いていったのでしょうか。
    級数などという考えは日本には無かったのでしょうか。
    こんなのいじっていると暇つぶしには事欠かないみたいですね。

    1. 関孝和氏は円と外接する多角形と内接する多角形から円周率を導いたと聞いた気がします。独自に微積分の概念にもたどり着いていたとか、真に偉人ですね。
      でも疑問なのはどうして円周率って考えに到達したんだろうということです。この辺は数学でなく哲学になって来るので難しいですけど。なにか必要が有ったのでしょうかね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です