円周率の設定値

[戻る]

たまに三角関数とかを使った制御プログラムとかシミュレーションプログラムを組むことがあります. 当然, そういった計算には円周率πが必要です. 昔は M_PI という定義を使っていましたが, 使えたり使えなかったりするので最近は自前で define しています. 定義値は私が覚えている円周率 3.14159265358979 です. 理由は簡単

というものです. でもこの値ってどこまで正確なのでしょう. double で演算させる際に必要十分な桁数に対してどれくらい足りないのか少し興味が出てきたので調べてみました.

コンピュータ内での浮動小数点は IEEE 754 という規格で格納されています. IEEE 754 というのは簡単に言うと実数 R を

と表すものです. ここで a は 1 か 2, b は適当な整数, c_i は 0 か 1 です. 円周率の場合 c_i は

c={100100100001111110110101010001000100001011010001100001000110100110001001100...}

となります (a は 2, b は 1). 面倒なので 16 進で表すと
9 21 fb 54 44 2d 18 46 98 98...
double (64 bit 倍精度) の場合 n = 52 なので, このうち
9 21 fb 54 44 2d 18
までの値となります.

10 進で表現すると


3.141592653589793115997963468544185161590576171875

という値です. 本当のπは

3.1415926535897932384626433832795028841971693993751...

という値ですので, およそ 0.0000000000000001 程の違いだということが分かります. これ以上の精度は double だと出せません. そもそもここまでの精度が必要なプログラムなんて私は組みません.

後はどういう値で define すれば 9 21 fb 54 44 2d 18 と格納されるかです. もちろん 3.1415926535897932384626433832795 とでも定義すれば格納されるのでしょうが必要十分ではありません. ほしいのは必要かつ十分に格納される最少桁数の値です.

まぁ上記を見ればわかりますが, 3.1415926535897932 もしくは格納可能な値としてより近い3.1415926535897931 が妥当なようです.

VC++ 2008 で調べてみると下二桁が 29〜33 の時 9 21 fb 54 44 2d 18 という値で格納されるようです. まぁだからといってわざわざ 3.1415926535897929 とかで定義しようとは思いませんが...


2016.2