Enrich Human Knowledge

人類全体の知識向上を目指して

Chapter3 演習問題 円周率の級数による計算プログラム

 まず、プログラム全文を載せる。

# -*- coding: cp932 -*-
# pical.py
#   円周率を計算する。
#   計算誤差も表示する。

import math

def main():
    print "このプログラムは円周率を級数を用いて計算します。"
    print "また、計算誤差も出力します。"
    print
    n = input("級数の取る和の項数を入力して下さい: ")

    sum = 4  # 初期化
    for k in range(2, n + 1):
        i = (-1) ** (k - 1) * 4.0 / (2 * k - 1)  # 級数のk番目の項の計算。
        sum = sum + i

    print "円周率の計算結果は", sum, "です。"
    print "誤差は", math.pi - sum, "です。"

main()


 学んだこと:

  1. このプログラムは問題の内容を聞いてからちょっと考えて、その形が大体分かった。それですぐにコードを書き始めたのだが、すらすらとは行かなかった。むしろ、書いている途中で何度もいろいろ修正をしなければならなくなり、コードを上下と行き来する羽目になった。教訓:プログラミング言語で書き下す前に、まず擬似コードで全体の構造をはっきりさせた方が良い
  2. 地味に整数型と浮動小数点型の区別が重要。
  3. この級数の収束は遅い。実際、このプログラムを実行すると、
このプログラムは円周率を級数を用いて計算します。
また、計算誤差も出力します。

級数の取る和の項数を入力して下さい: 10
円周率の計算結果は 3.04183961893 です。
誤差は 0.0997530346604 です。
>>> pical.main()
このプログラムは円周率を級数を用いて計算します。
また、計算誤差も出力します。

級数の取る和の項数を入力して下さい: 100
円周率の計算結果は 3.13159290356 です。
誤差は 0.00999975003124 です。
>>> pical.main()
このプログラムは円周率を級数を用いて計算します。
また、計算誤差も出力します。

級数の取る和の項数を入力して下さい: 1000
円周率の計算結果は 3.14059265384 です。
誤差は 0.000999999749999 です。

というように、1000項計算しても三桁位の精度しかない。