大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

整数だけで円周率

株式会社クローバーフィールドの経営理念
著者:高木信尚
公開日:2016/01/25
最終更新日:2018/06/13
カテゴリー:雑記
タグ:


こんにちは、高木です。

小学校のときに3.14と習った円周率ですが、円周や円の面積をはじめ、いろいろなことに使います。
当然、プログラミングをやっているときにも、数学的な要素が絡んでくる場合は普通に円周率を使うことになります。

プログラミングに使うのですから、長大な桁数の円周率を丸暗記するとか、暗算や筆算で円周率を含む計算をするようなことはしません。
3.141592653589793238462643383279…という値を必要な桁数であてはめればいいだけのことです。

ところが、そういかない場合があるのです。
今日のPCやサーバーなどを相手にしているうちはいいのですが、ローエンドのマイコンを扱うときに問題が出てきます。

そうしたローエンドの環境では、FPU(浮動小数点ユニット)がないのが普通です。
FPUなしで小数の計算をしようとすると、とんでもなく時間がかかるだけでなく、プログラムサイズもあっと驚くぐらい大きくなってしまいます。

この問題を回避するには、小数ではなく、整数だけを使って円周率を扱う必要が出てきます。
ここで登場するのが、5世紀中国の数学者、祖沖之による \(\frac{355}{113}\) という近似値です。

113355という覚えやすい数列を真ん中で2分割し、それぞれを分母と分子にすればいいのですから簡単に覚えられます。
これで6桁以上の精度が得られますので、単精度浮動小数点数と同程度の精度だと考えればいいでしょう。

オーバーフローに注意しつつ、355を掛けてから113で割れば、円周率を掛けたのとほぼおなじ結果が得られます。
たとえば、半径が3200の円の面積を求めるには、3500 * 355 / 113 とすればいいのです。

もっと低い精度でよければ、\(\frac{22}{7}\) でもOKです。
3.14と大差ない精度ですが、\(\frac{314}{100}\) とするより小さな数しか扱いませんので、オーバーフローの心配が少なくなります。

こういうのを知っていると、役立つ機会は意外に多いものです。

    上に戻る