2004|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|11|12|
2011|01|
2014|05|08|

2009年08月24日(Monday) [長年日記]

_ [日記][コンピュータ] プログラムでの円周率πの定義方法

最近の言語だと最初から円周率が定義されている物も多いですね。

C言語などで円周率を使う場合はなんとなく、


#define PI 3.1415926535897932384626433832795 //電卓からコピペ


みたいに書くでしょうか。

(Windowsの電卓で[PI]を押してそれをコピペしたので桁が長いですが、こんなに桁増やしても意味ありません)


大昔に発見された分数近似を使って


#define PI (355.0/113.0)


ってのも面白そうです。

355/113とπの誤差は8.49e-8しかありません。(不思議ですよね)

ちなみに次に(もっと)精度の良い分数近似は312689/99532です。

355/113のすごい所はたった3桁同士の除算なのに精度がとても良いことです。

ちょっと応用して整数をπで除算したいならば、n*113/355 なんてすると精度が良かったりしますね。

コンピュータの無い時代に、355/113なんてのは偶然値が近いだけで全く何の意味もない数字であるという意見の人もいたそうですが、このようなプログラムの工夫には驚くべき有用性です。


後は、


#define PI 6.0*asin( 0.5 )

又は

static const double PI = 6.0*asin( 0.5 );


なんてのもお洒落(?)です。

この前みかけて(?)って思いましたが(少しひねくれてますよね・・)

sin(π/6)=0.5から。

asin(x)をテイラー展開してxに0.5を入れることで円周率を計算する方法は収束が早いので優れた方法です。

しかし2*asin(1)とか4*atan(1)でも良さそうなモノですが敢えて6.0*asin( 0.5 )にするところに気高さが感じ取られます。


さてはて。

色々あるようですが、可読性も含めてどれが良いでしょうねえ?

精度を考えたら最後の方法が良いのかもしれません。

PIって名前で定義すれば内容は判るので気にするやり方は必要ないかもしれませんけどね。


みなさんはどうしていますか?


最近のコメント

364,000 at 2008.06.14
Copyright (c) Suika KNOnline.NET