脳内計算尺
以前、計算尺相当の有効数字での計算ならば指数関数を除いて暗算可能だ、という話をしたことがある。
捜し物をしていて、偶然、そのことを記したメモを見つけたので、忘れないうちに転載しておく。
手順:
Use R4, R5, R6, R7 4番から7番までのレジスタをアキュムレータとして使用する
Mov R1, degree 1番レジスタに角度値(まだ度分秒)をロード
Mov R2, C_PI 2番レジスタに円周率の値をロード
Mul R1, R2 1番レジスタに2番レジスタの値を乗算
Mov R2, 180 2番レジスタに180(定数)をロード
Div R1, R2 1番レジスタを2番レジスタで除算(これで角度が弧度法に)
角度を弧度法に変換している。円周率を乗ずる際には、筆算だと3桁×3桁で、乗算記号の下に4段の数字が並ぶので、4つのレジスタを計算途中の一時記憶用として使用する。
言い換えると、3桁×1桁の乗算は、脳内レジスタを消費せずに計算できなければならない。また、小数の位取りは、自分で調節しなければならない。
258 1番レジスタに格納済(実際には様々な値)
x 314 2番レジスタに格納済(円周率の最初の3桁)
−−−−−−−−−
1032 4番レジスタを使用
258 5番レジスタを使用
774 6番レジスタを使用
−−−−−−−−−
81012 7番レジスタを使用 → 1番レジスタに再格納、
このとき、有効数字4桁目以降の四捨五入と、小数位置の確認を同時に行っている。
Mov R2, R1
Mul R2, R1 2番レジスタには角度xの2乗が格納される
Mov R3, R2
Mul R3, R1 3番レジスタには角度xの3乗が格納される
このとき、いすれも4番〜7番レジスタが、第一段の場合と同様に、計算途中結果の格納用として使用されていることに注意。
Free R4, R5 4番及び5番レジスタをアキュムレータとしての役割から解放する
Mov R4, R3
Mov R5, 6
Div R4, R5 4番レジスタには x3/6 が格納される
Sub R1, R4 1番レジスタに、x−x3/6 が格納される
Use R4, R5 4番、5番レジスタを再度アキュムレータとして使用する
Mul R2, R3 2番レジスタには角度xの5乗が格納される
Mov R3, 120
Div R2, R3 それを120で割って、2番レジスタの値が x5/120 となる
Add R1, R2 1番レジスタに2番レジスタを加える。これは殆ど不要であることが多い。
Free R4, R5, R6, R7 アキュムレータを解放して
return R1 終わり。1番レジスタに、有効数字3桁で、sin X が格納されている。
これらの手法、特に最後の Exp は、計算量が膨大なため、脳内レジスタの疲労によるメモリ揮発が心配である。Geo80k のように中高年になってしまうと、特にメモリリフレッシュで苦労する。
アルゴリズムもエレガントの対極である。(4)〜(7) までのループがひどい。