12cは金融電卓である。財務・金融の関数・機能は豊富だが、数学関数は最小限のものしか組み込まれていない(金融電卓なのになぜか数学関数も入っているというべきかも知れない)。
しかしである。12cにはプログラム機能がある。最小限の関数から機能を増やしていくことができる。数学の勉強と12cプログラミングの勉強を兼ねていくつか書いてみている。
HPの電卓といえば4段スタックとRPNが特徴だけれど、スタックにX, Y, Z, Tと記号がついている点、モデル図はT(スタックの底)が最上位になるように配置される点、スタックから値をポップしてもTは空にならない点がプログラミングの世界で扱われるスタックと大きく異なる。電卓として使いやすいように工夫したわけだろうな。
凡例
[英数字]
12cのキーを表す。fキー、gキーは特に明記しない。
{値}
{値} → {値}
スタックの状態と変化(計算の結果)を表す。{}の中は右端がスタックトップ(X)。
常用対数を求める
自然対数を求める関数lnがあるので、対数の底の変換公式
log_a X = log_b X / log_b a
から
log_10 X = ln X / ln 10
で求められる(12cの取扱説明書にも書いてある)。
プログラム
{N} → {常用対数}
[ln]
10
[ln]
[÷]
順列
公式
nPr = n! / (n-r)!
を素直にプログラム。入力も素直に{n, r}としたいわけだが、スタック上はXにr, Yにnが入るので、n-rを求めるのが手間(nのコピーは残しておかなければならない。[LST x]も使えない)。本格的なスタック式
計算機なら、dup(スタックトップをコピー)やover(二番目のセルをコピー)、roll(スタックトップを三番目のセルに移動)といったスタック操作演算が使えるけれど、12cには実装されていない。そのためレジスタ0を破壊してしまうのが不満。
プログラム
{n, r} → {nPr}
[x><y] ; {r, n}
[STO] 0 ; nをレジスタ0に退避
[x><y] ; {n, r}
[-]
[n!] ; {(n-r)!}
[RCL] 0 ; {(n-r)!, n}
[n!] ; {(n-r)!, n!}
[x><y] ; {n!, (n-r)!}
[÷] ; {nPr}
ただし12cはあまり大きな数は扱えない。
整数の除算(商と剰余)
33sの方で最大公約数(ユークリッドの互除法)をプログラムしたので、12cでも商と余りを求める計算をプログラムしてみる。
m ÷ n = q …r
(m = qn + r かつ 0 ≦ r < n)
を素直にプログラムする。
プログラム
{m, n} → {Quotient, Remainder}
レジスタ1, 2を破壊する。
[STO] 2 ; n(法数)をレジスタ2に退避
[x><y] ; {n, m}
[STO] 1 ; m(被除数)をレジスタ1に退避
[x><y] ; {m, n}
[÷] ; {÷}
[INTG] ; {Quot}
[STO] [×] 2 ; Quot×nをレジスタ2に退避
[RCL] 1 ; {Quot, m}
[RCL] 2 ; {Quot, m, Quot×n}
[-] ; {Quot, Rmdr}
表示されるのは剰余。[x><y]を押すと商を表示する。
最終更新:2007年01月06日 01:14