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

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

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

 今度は引き算を試してみます。関数 minus() を書きました。繰り下がりは、あれば cf = 1とし、なければ cf = 0 で処理します。各桁ごとに1桁の数の引き算をし、結果が負になったら繰り下がりありとして引き算の結果には10を加えます。これを繰り返します。

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
#
#minus(LU, LD, MU, MD, SU, SD)コールで
#SU.SD = LU.LD - MU.MD と入る
#
def minus(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] < 0:
            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] < 0:
            SU[Uketa - i - 1] += 10
            cf = 1
AU = [0, 0, 0, 6, 8, 3, 1]
AD = [6, 5, 9, 1, 0, 0, 0]
BU = [0, 0, 0, 5, 9, 1, 9]
BD = [4, 7, 2, 3, 0, 0, 0]
plus(AU, AD, BU, BD, CU, CD)
print('plus ', CU, CD)
minus(AU, AD, BU, BD, CU, CD)
print('minus ', CU, CD)
sys.exit()

 実行結果は以下の通りです。

plus [0, 0, 1, 2, 7, 5, 1] [1, 3, 1, 4, 0, 0, 0]
minus [0, 0, 0, 0, 9, 1, 2] [1, 8, 6, 8, 0, 0, 0]

大丈夫みたいですね。ただ、引き算の結果が負になるようなことがあるとおかしな結果になります。なので、円周率の計算では注意しなければなりません。でも、

f:id:Inuosann:20201108175332p:plain:w200
f:id:Inuosann:20201108175418p:plain:w350

を使うつもりなので、引き算の結果が負になる心配は要りません。負の項はその左の正の項よりも絶対値が小さいからです。
 次はかけ算。すでに書いた、plus()を繰り返し利用すればいいわけですね。やってみます。