[表紙へ]
▼ 変更履歴

RPN と 4 Level RPN 電卓

今回はヒューレット・パッカード社の電卓で使われている 4 Level RPN について書いてみたいと思います。

(注)2015年11月にヒューレット・パッカード社はHP Inc.とヒューレット・パッカード・エンタープライズの2つに分離しましたが、ここではヒューレット・パッカード社(以下HP社)とします。

目次

RPNについて

RPN は Reverse Polish Notation(逆ポーランド記法)という数式の記述方法です。
我々が学校で習って使っている数式は「 中置記法 」と言うもので、例えば、

1 + 2

と書きます。
しかし、RPNの場合は同じものを

1 2 +

と書きます。後置記法とも言います。
これを日本語に似ていると言う人もいます。上の例では「1と2を足す」と解釈できます。
しかし、複雑な数式ではそのような意見にあまり意味がないと思います。
例えば、中置記法で (2 + 4) * (5 - 3) / (9 + 1) と書いたものをRPNで表現すると、

2 4 + 5 3 - * 9 1 + /

となります。
これを日本語で解釈すると「2と4を足したものを、5から3を引いたものと乗算し、その結果を9と1を足したもので割る。」となります。
確かに数値と演算子の順序だけは日本語に似てますが、少し無理がありませんか?日本語に似ていたとしても分かりにくいだけです。中置記法で書いた数式の方が圧倒的に分かりやすいと思います。
インターネットで「RPNは日本語のままで考えることができる」と主張している人が多く見受けますが、上式よりもさらに複雑な式になると日本語で考えることに意味はないでしょう。そういう主張をする人たちはよほど簡単な計算しかしない人なのでしょうか?
私はRPNが日本語に似ているという見解に意味はないと思います。ただの数式の記法の一種と考えるべきでしょう。

4 Level RPNで "1 2 +" の計算をする

RPNの式を電卓で解く時はスタックというデータ構造を使って解く必要があります。
念のために書いておきますが、CPUのスタックではありません。
それと一般的なコンピュータ工学で使われるスタックのPUSH/POPの概念とは多少異なります。

ここではグラフ電卓ではないHP社の電卓(例えばHP 12cやHP 35s)で使われている 4 Level RPN を前提にしてRPNの数式"1 2 +"を解いてみます。

ボタン操作は、[1][ENTER][2][+]となります。数値と数値の間を区切るために[ENTER]が必要です。

下の図が4 Level RPNのスタックです。初期化時は0が入っています。
X,Y,Z,Tはレジスタと呼ばれるもので、一番下のXから数値を入れることができます。

f:id:nekosuki2017:20170221162140p:plain

電卓で1を入力すると下図のようになります。

f:id:nekosuki2017:20170221162201p:plain

そしてENTERを押すと、Z→T、Y→Z、X→Yとコピーされます。
上にずれるような感じです。このとき、Xは変化しません。

f:id:nekosuki2017:20170221162218p:plain

さらに電卓で2を入力すると下図のようになります。ENTERは押していません。

f:id:nekosuki2017:20170221162242p:plain

ここで、+ボタンを押すと、+コマンドが発動します。
+コマンドが下から(Xから)数値を2つ取り出すのですが、1回取り出す毎にY→X、Z→Y、T→Zとコピーされます。このとき、Tは変化しません。
つまり、ENTERを押したときと逆のような動きになります。下へずれるような感じです。
2つの数値を取り出すので、スタックは以下のように全て0になります。

f:id:nekosuki2017:20170221162421p:plain

これで1と2が取り出されました。 この動作は表示されません ので、以後、コマンドが2つの数値を取り出すときの図は 省略 します。
+コマンドは計算結果をスタックに戻します。ENTERを押したときと同じ動作(この場合、スタックの内容は全て0なので意味はないが機械的に行う)をしてから1+2=3をXに入れます。

f:id:nekosuki2017:20170221162450p:plain

これでRPNの数式"1 2 +"の結果が出ました。

スタックの下から数値を入れて、出すのも下からが 4 Level RPN のスタックの基本です。コンピュータ工学のスタックでは上から出し入れするので、少し違っています。

ここでスタックの動作をまとめます。

  1. ENTERを押したとき :上にずれる。Z→T、Y→Z、X→Yとコピーされる(Xは変化しない。Tの内容は消える)
  2. コマンドが数値を1つ取出すとき :下にずれる。最初にXから数値を取り、Y→X、Z→Y、T→Zとコピーされる(Tは変化しない。Xの内容は消える)
  3. コマンドがスタックに結果を戻すとき :ENTERを押したときと同じ動作をしてからXレジスタに結果を入れる。

コンピュータ工学で言えば、2がPOPで、3がPUSHです。1はスタックを上にずらすだけなので、PUSHの一部です。1のENTERが通常のスタックの概念と少し異なるのです。これはPUSHと違って入れる数値を人間に入力させるためにこのようになっているのです。
これらの動作はスタックの基本ですので、今後の説明では省略します。

下の写真はHP 12c PlatinumがRPNモードで動作している写真です。

f:id:nekosuki2017:20170221162617j:plain

HP 12c Platinum は液晶表示装置が1行しかありませんので、 常にXレジスタだけを表示 しています。
HP 35sのように2行表示でX,Yレジスタを同時に表示できるものもあります。
どちらにしてもレジスタの一部しか表示されませんので、操作にはそれなりの慣れが必要です。

4 Level RPNで "2 4 + 5 3 - * 9 1 + /" の計算をする。

さらに前述のRPNの式 " 2 4 + 5 3 - * 9 1 + / " を解いて見ましょう。
(中置記法で (2 + 4) * (5 - 3) / (9 + 1)と同じ意味)

ボタン操作は[2][ENTER][4][+][5][ENTER][3][-][*][9][ENTER][1][+][/]となります。数値と数値の間に[ENTER]を押して数値を区切る必要があります。

スタックは0で初期化されているとします。

f:id:nekosuki2017:20170221162140p:plain

最初に2を入力します。

f:id:nekosuki2017:20170221162903p:plain

そして、ENTERを押すと下図のようになります。

f:id:nekosuki2017:20170221162917p:plain

4を入力します。ENTERは押しません。

f:id:nekosuki2017:20170221162935p:plain

そして、+ボタンを押すと、+コマンドがスタックの下から2つ数値を取り出して加算し、その結果をスタックに戻します。この場合、2+4=6をスタックに戻します。

f:id:nekosuki2017:20170221163015p:plain

次に5を入力すると、自動的にENTERと同じ動作をしてからXレジスタに5が入ります。演算をした直後は自動的にENTERと同じ動作をします。

f:id:nekosuki2017:20170221163046p:plain

ここでENTERを押すと、下図のようになります。

f:id:nekosuki2017:20170221163102p:plain

3を入力します。ENTERは押しません。

f:id:nekosuki2017:20170221163116p:plain

ここで-ボタンを押すと、-コマンドがスタックの下から2つの数値を取り出して減算し、その結果をスタックに戻します。この場合、5-3=2をスタックに戻します。

f:id:nekosuki2017:20170221163128p:plain

さらに*ボタンを押すと、*コマンドがスタックの下から2つの数値を取り出して乗算し、その結果をスタックに戻します。この場合、6*2=12をスタックに戻します。

f:id:nekosuki2017:20170221163144p:plain

次に9を入力すると、自動的にENTERと同じ動作をしてからXレジスタに9が入ります。演算をした直後は自動的にENTERと同じ動作をします。

f:id:nekosuki2017:20170221163156p:plain

ここでENTERを押すと下図のようになります。

f:id:nekosuki2017:20170221163209p:plain

1を入力します。ENTERは押しません。

f:id:nekosuki2017:20170221163223p:plain

ここで+ボタンを押すと、+コマンドがスタックの下から2つの数値を取り出して加算し、その結果をスタックに戻します。この場合、9+1=10をスタックに戻します。

f:id:nekosuki2017:20170221163236p:plain

最後に/ボタンを押します。/コマンドがスタックの下から2つの数値を取り出して除算し、その結果をスタックに戻します。この場合、12/10=1.2をスタックに戻します。

f:id:nekosuki2017:20170221163248p:plain

これで"2 4 + 5 3 - * 9 1 + /"の答えは1.2と求まりました。
中置記法でも同じ答えになります。 (2 + 4) * (5 - 3) / (9 + 1) = 1.2

このようにして4 Level RPN電卓は式を括弧なしで計算できます。しかし、慣れが必要なのも事実です。上述のスタックの動きを理解しないと正確な計算は難しいと思われます。
ちなみに 4 Level RPNは数値の計算しかできません。変数の入った代数式などは扱えないのです。

(2020年7月24日追記)
「4 Level RPNは数値の計算しかできません」と書きました。基本的には間違いではありません。
ところが、一部の4 Level RPN電卓は、ベクトルや行列も扱えるように拡張されています。
例えば、 HP-42S は、ベクトルと行列の計算ができます。 HP 35sは、3次元までのベクトルを扱えます(行列は扱えない)。
しかし、4 Level RPNのベクトルや行列の要素は数値ですので、結局は数値の計算しかできないと言えます。

4 Level RPN電卓の現状

2017年2月現在、4 Level RPNを搭載した電卓は未だに製造販売されています。ほとんどが金融電卓なのは 4 Level RPN が四則演算に向いているからでしょう。

この中で純粋なRPN電卓は HP 12c だけでそれ以外の機種はALGモードという中置記法のモードも持っています。

(追記)書き忘れていましたが、 SwissMicros というメーカーも4 Level RPN電卓を作っています。HP社の過去の機種のクローン電卓を作っているメーカーです。

次回は、 RPL言語 について書いてみたいと思います。

[表紙へ]