円周率を求めるのに、何ビット長の変数が必要か
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ビットの受け皿が必要。