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

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

数式を入力できる電卓の仕組み

 100均の電卓で「2+3×4=」と打つと「2+3×」の段階で「5」と表示され、続けて「4=」と打つと「20」と出ます。数式の計算としては誤っていることに注意してください。正解は14です。×、÷は+、-に優先して計算しなければならないのでした。しかし電卓は入力された順に計算してゆくように設計されており、使うときにはそのつもりでいなければなりません。じゃあ、と今度はスマホの電卓で試してみると……「2+3×4」と入力して、次の「=」でしっかり「14」となりました。スマホの電卓は「2+3×」までで普通の電卓みたいに「おっ、2+3なら計算できる、5だ!」とか慌てることなく「×の記号がある。次に数が入力されたら、×が優先なんだからこちらを先に計算しよう」と考えて2+3×4=2+12=14と正しい結果を出せるわけです。スマホの電卓はその意味で100均の電卓よりも優れています。
 スマホの電卓はどうしてこんなことができるのでしょうか。実はスタックという機構を利用しているのです(例えばの話。ほかにも方法はあります)。「『こちらを先に計算しよう』と考えて」とさっき書きましたが、スタックによってこれを実現しているわけです。「スタック(stack)」のもとの意味は「干し草の山」。荷物を下から順に積み上げてゆくイメージです。スタックは、データをどんどん積めるが、おろすのは一番上から、という制約のある記憶装置です。図1は、「2+」までを読んだところ(2を読んで積み、+を読んで積んだ)。スマホのスタックがどうなっているか示しました。式をどんどん読み取って、図2となります。

f:id:Inuosann:20190817102303p:plain

スタックに数や記号を積むのです。この動作をプッシュ(push)と言います。ここまでスマホはプッシュ以外、何もしません。しかし、次に4が入力されてこのデータがスタックに積まれたら(図3)、「×」は優先して計算しなければならないので3、×、4をスタックから下ろします(図4)。

f:id:Inuosann:20190817102418p:plain

この、データをスタックからおろす動作をポップ(pop)と言います。そして「3×4」を計算して「12」を求めてプッシュします(図5)。次に2、+、12をポップして(図6。この段階でスタックは空になる)「2+12」を計算して求め、「14」をプッシュして終了(図7)。ようやく計算が完了しました。

f:id:Inuosann:20190817102549p:plain

 ぼくの手元のスマホの電卓では括弧を扱えません。しかし「2+(3+4×5)」といった計算もできた方がいいことも多いでしょう。今回説明はしませんが、実はこれもスタックを使って計算できるのです。この辺の話は前に紹介した『明快入門 インタプリタ開発 基本技術から処理系の実装まで』(林晴比古2012ソフトバンククリエイティブ)に詳しく書いてあります。これを読めば数式(括弧があってもOK)を入力すると数式のルールに従って計算してくれるソフト(アプリ)を自分で作ることができるようになります。そして、そのまま勉強を続ければ自作のプログラミング言語にたどり着くのです。

明快入門 インタプリタ開発 (林晴比古実用マスターシリーズ)

明快入門 インタプリタ開発 (林晴比古実用マスターシリーズ)