円周率を求めるのに、何ビット長の変数が必要か
2007年4月29日
表題の問題を解くために、1ビット長から19ビット長までの整数型を仮定し、円周率を求めてみた。
用いたプログラム
実行結果
3.1416 なら、16ビットで求められそうである。ただし、16ビットどうしの乗算を行うので、その結果には32ビットの受け皿が必要。
用いたプログラム
#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ビットの受け皿が必要。