シミュレーション

円周率を求めるのに、何ビット長の変数が必要か

2007年4月29日

表題の問題を解くために、1ビット長から19ビット長までの整数型を仮定し、円周率を求めてみた。

用いたプログラム
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

double sub();

void main (){
    for(unsigned int i=0;!kbhit();i++){
        double pai=sub();
        printf( "%d %f\n", i, pai);
    }
}

double sub(){
    static int n;
    double pai;
    double x,y,ys,max;
    double num=0;
    double inside=0;
    
    n++;
    max=1;
    for (int i=0;i<n;i++) max=2*max;

    for(x=0;x<=max;x++){
        if (0<x && x<max) ys=max-x;
        else ys=0;
        num+=ys;
        inside+=ys;
        for(y=ys;y<=max;y++){
            num++;
            if ((x/max)*(x/max)+(y/max)*(y/max)<1) inside++;
            else {
                num+=(max-y);
                break;
            }
        }
    }
    
    // Calculate the pai
    pai=4*(double)inside/(double)num;
    
    return pai;
}

実行結果
0 1.777778
1 2.400000
2 2.765432
3 2.961938
4 3.059688
5 3.101538
6 3.121207
7 3.132220
8 3.136828
9 3.139263
10 3.140461
11 3.141020
12 3.141309
13 3.141451
14 3.141522
15 3.141557
16 3.141575
17 3.141584
18 3.141588
19 3.141590

3.1416 なら、16ビットで求められそうである。ただし、16ビットどうしの乗算を行うので、その結果には32ビットの受け皿が必要。

コメント

コメントはありません

コメント送信