いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

Pythonで円周率を小数第100位まで求める(2)

 まずリスト同士の足し算の関数を作ります。5831.6591 + 6019.4723 を計算します。リストAUに5831.6591の整数部分を、ADに小数部分を入れます。同様にBU、BDにも値をセットし、plus(AU, AD, BU, BD, CU, CD)をコールするとCU, CDに計算結果が入ります。Uはup、Dはdouwnのu、dです。Uのつくリストは長さUketa、DのつくリストはDketaです。このように桁数を共通にしておかないとうまくいきません。円周率の小数第100位までの計算なら Uketa = 3、 Dketa = 110 とでもしておけば十分でしょう。繰り上がりは変数cfに1を入れて次の計算に反映させます。実験なので今回は桁数は整数部分も小数部分も7桁にしました。

import sys
Uketa = 7
Dketa = 7
global AU, AD, BU, BD, CU, CD
AU = [0.0] * Uketa
AD = [0.0] * Dketa
BU = [0.0] * Uketa
BD = [0.0] * Dketa
CU = [0.0] * Uketa
CD = [0.0] * Dketa
#
#plus(LU, LD, MU, MD, SU, SD)コールで
#SU.SD = LU.LD + MU.MD と入る
#
def plus(LU, LD, MU, MD, SU, SD):
    cf = 0
    for i in range(Dketa):
        SD[Dketa - i - 1] = LD[Dketa - i - 1] + MD[Dketa - i - 1] + cf
        cf = 0
        if  SD[Dketa - i - 1] >= 10:
            SD[Dketa - i - 1] -= 10
            cf = 1
    for i in range(Uketa):
        SU[Uketa - i - 1] = LU[Uketa - i - 1] + MU[Uketa - i - 1] + cf
        cf = 0
        if  SU[Uketa - i - 1] >= 10:
            SU[Uketa - i - 1] -= 10
            cf = 1
AU = [0, 0, 0, 5, 8, 3, 1]
AD = [6, 5, 9, 1, 0, 0, 0]
BU = [0, 0, 0, 6, 0, 1, 9]
BD = [4, 7, 2, 3, 0, 0, 0]
plus(AU, AD, BU, BD, CU, CD)
print(CU, CD)
sys.exit()

結果は以下の通りです。
[0, 0, 1, 1, 8, 5, 1] [1, 3, 1, 4, 0, 0, 0]

おお、うまくいってます!! これで小数部分が100桁あっても足し算ならできるようになりました。次は引き算、かけ算、そして割り算です。割り算は面倒かも……。