まずリスト同士の足し算の関数を作ります。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桁あっても足し算ならできるようになりました。次は引き算、かけ算、そして割り算です。割り算は面倒かも……。