プログラマ電卓 HP-16C【私の愛用している技術系アイテム】

2022年05月25日 水曜日


【この記事を書いた人】
和田 英一

2002年から約10年 IIJ技術研究所長. 年を取ってからは古い計算機や昔の計算法に興味が増し, シミュレーターを作ってそのプログラムを書いたり. 近頃はKnuthのTAOCPにあった問題のプログラムなどに挑戦したりしている.

「プログラマ電卓 HP-16C【私の愛用している技術系アイテム】」のイメージ

計算機を使うのにも計算機が必要だとは, 1958年3月, 私が大学院生でいた研究室で組み立てたパラメトロン計算機PC-1が稼動し始め, プログラミングに熱中するまで思いもよらなかった.
プログラムに必要な初期値を用意するとか, 結果を検算するとか, 手でも計算する機会は増えた. 当時は, 研究室にあった機械式手回しのタイガー計算機が主力であった.
1960年頃, ある計算センターで, IBM社の大型計算機IBM7040を使う機会があった. この計算機は1語36ビットで, コンパイラの出力情報などはすべて八進法で表示され, アドレス計算も八進法で行った. それを紙と鉛筆で計算するのがだんだん面倒になり, 私は通常のそろばんを八進法に改造し, 大いに活用した. 思いの他便利であった.

八進法そろばん

その後も, プログラミングやデバッギングなどでは, 二進法や八進法や十六進法での計算の機会は多い.
一方, 1970年代からは集積回路が普及し, 多様な電卓が世に出回るようになった.
電卓にもいろいろあったが, HP(Hewlett Packard)の電卓は, 後述するように, RPN(Reverse Polish Notation 逆ポーランド記法)という, 私の好きな方式だったので, 関数電卓HP-35を購入した. これはこれでいい機械だったが, そのうち登場したのが, プログラマ用電卓と銘打ったHP社のHP-16Cであり, 兼ね兼ねそういう計算機が欲しいと思っていた私は即刻購入した.

左HP-16C (128mm x 79mm) 右Sinclair Scientific (50mm x 111mm) (Wikipediaから)

最大の特徴は, 十進法だけでなく, 二進法, 八進法, 十六進法も使えることで, 私としては, これだけで十分であったが, 浮動小数点演算やビット演算も出来, さらにプログラムを格納し, 後でそれを使っての計算も出来た. ただ, プログラムは, 入力や修正が面倒で, 私はプログラム機能は殆ど使わなかった.
ところで, 我々が普段使う式は, 加減算や乗除算のような算術二項演算は, 1+2, 3×4のように, 2つの被演算子の間に演算子を置く演算子中置記法(infix notation)だが, この記法では, 「…, 演算子, 被演算子, 演算子, …」のように並ぶと, 左の演算子は右から被演算子が欲しく, 右の演算子は左から被演算子が欲しく, 中の被演算子は, 両側の演算子に引っぱられ, どちらの演算を先にやるかの問題が生じる. (私はこれから, 中にいる子を, 両側の母親と称する女が, 「私が実の母親だ」といって引き合う大岡裁きを連想する.) そこでかっこが発明され, 被演算子の両側が乗除算と加減算では, 乗除算が先という通則が生まれた. しかし, かっこなしでも, 乗除算優先の通則なしでも, 演算の順が決るというのが, 演算子後置記法(postfix notation)や, 演算子前置記法(prefix notation)である.
Hewlett Packardの電卓は, 後置記法であるRPN(Reverse Polish Notation)を使うので, その話から始めよう. (ポーランド記法は前置記法)
中置記法では, 1+2+3の場合, 左の加算の先にやるのは(1+2)+3, 右を先にやるのは1+(2+3)と書くが, RPNでは, 前者は1 2+3+, 後者は1 2 3++ と書く. 日本語では, 式に書いてある記号を, 左から右へ順に, 前者は「1に2を足したものに3を足す」と読み, 後者は「1に2に3を足したものを足す」と読む. 助詞を無視すれば, 日本語の語順と, まったく同じなので, 日本語記法という人さえいる. 中間にあった演算子が抜け, 2つの被演算子が直接並ぶことになったので, かっこが不要になった代りに, (上の例では空白であるが,) 被演算子が並んだ場合の区切記号が必要になった. 以下ではそれにカンマを使う. (上の例のように, 被演算子が常に数字1桁だけなら, 区切記号はいらない.)
余談だが, 我々は平気で1+2+3のように書く. 小うるさい本では, +演算では結合則が成り立ち, (a + b) + c = a + (b + c)なのでこれをa + b + cと書いてよいと断わる.
これが出来るのは, 演算子ごとに, 被演算子の個数と結果の個数が決っているからである. +は被演算子が2個, 結果が1個なので, 1,2,3+ と来ても, 足されるのは直前の2と3だけであり, +演算の結果, 2と3は使ったから取り除き, その場所に結果の5を残す. 次に2番目の+が来て, 前にある1と5を足すことになる.
平方根の演算子は, 被演算子1個を右に置き, 結果の値も1個である. 例えば, 中置記法のは, 3, 3×4, 4×+√ と書く. (平方根号は前置記法だが, その1個の被演算子の範囲を示すのに, かっこの代りに根号から始まる上線を使う.)
前にあって, 後で使われる数は, 計算機内のスタックに入れておく. HP-16Cはスタックが4段しかないから, あまり複雑な計算は出来ないが,…
次の図は, 上の説明でのスタックの変化の様子を示す.

スタックの変化の様子

RPNは, 上の写真にあるSinclair Scientificでも使われた. Sinclair Scientific のシミュレータは
http://files.righto.com/calculator/sinclair scientific simulator.html
にある. 使い方はいささか難しい.
RPNは電卓としては珍しいかもしれないが, 処理系がプログラムの計算式を中間言語に変換する場合は, 殆どRPNのような形に変換するから, 見えないところでは, 普通に使われている.
また, 私が日常, PCで図を描くのに使うプログラミング言語PostScriptは, その名前が「あと書き」というように, オペレータを最後に置く方式で, 私には使い勝手がよい.
RPNが分ったところで, HP-16Cの概要に進む. 幸いとネット上に精密なシミュレータ
https://stendec.io/ctb/rpn_prog.html
とマニュアル
https://archive.org/details/hp-16c handbook/mode/2up?view=theater
が存在するので, 御用とお急ぎのない方は, シミュレータを操作しながら読んで, 感触を掴んで欲しい.

ネット上にあるHP-16C シミュレータとマニュアル

このシミュレータは, ダウンロードした時, 上のように表示されるかも知れない. 表示窓の両脇に, 実機にはない補助情報がある. HP-16Cの1語は64ビットまで任意の長さに設定出来るが, 表示窓には一部(8桁)しか出せない. 表示窓の右の補助情報には, 1語全体の値が出る. 左の補助情報, 56.2は1語が56ビット, 補数は2の補数の設定を示す. 右の十六進数が14桁あるから56ビットなわけだ. その下のW=0は, 長い語の右端を表示していることを示す.
説明用に私が書き直したキー配置は下のようだ.

HP-16Cのキー配置

数学の行列のように, 横を行, 縦を列とし, (ij)でi行j列のキーを表すと, (D0)には“A”のキーがあり, その上に“SL”, 下に“LJ”とある. このキーをいきなり押すと, 十六進法ではAが入力される. (A1)と(A2)に“f”と“g”のキーがあり, これが一種のシフトキーで, “f”を押してから“A”を押すと, 上に書いた“SL”(shift left), “g”, “A”と押すと, 下に書いた“LJ”(left justify)が入力される.
(A0)の“ON”で電源を入れる. 念のため(C3)の“DEC”を押してから, (表示窓の右のdを確認し,) 1×2+3×4をやろう. 右の方にある数字キー, 演算キーで, “1” “ENTER” “2” “×” “3” “ENTER” “4” “×” “+” と押すと目出度く14となる.
ここで(C5)“BIN”を押すと, 右に二進のbが現れ, 1110と出る. “OCT”で16, “HEX”でEが出る.
12の二乗を試す. (“ENTER”直後はスタック最上段が一瞬コピーされるので,) “12” “ENTER” “×” で144になるが, 八進法でも十進法でも十六進法でも144になる. 基数(何進法という数)をrと書くと, (1r + 2)2 = 1r2 + 4r + 4で, 4はrより小さくてキャリー(繰り上がり)が出ないから当然だ. 一方, 八進の100が十進で64, 十進の100が十六進で64なのも面白いが, こちらは偶然っぽい.
さらに遊んでみる. 十進法で12345679(最後の方の8がないので8桁)に9を掛けると9桁の111111111になるのはよく知られている. では他の基数ではどうか. まず八進法にして123457 × 7は? やってみると, 1111111 だ! 十六進法で試す. 123456789ABCDF×F=111111111111111 やったぁ! こういう長い数は, 8桁の表示窓には全部は表せない. 十六進を示す右端のhの左や右に点があると, 窓のその方向に見えない数字があることで, (A3)や(A4)の“<”, “>”で1桁ずつ移動して読み出す. 私は別にこういう計算で遊んでいるだけではないが, 八進法, 十六進法計算機ならではの計算を紹介した.
HP-16Cの売りのひとつは, プログラム機能である. 簡単な例で, 気分だけを味わうことにする. ユークリッドの互除法で, 最大公約数(GCD)を計算してみる.
例えば, 答えは見え見えだが, 56と21のGCDをとる. “56” “ENTER” “21” と実行し, “RMD”を押すと剰余14を得る. 直前の2個の被演算子, 56と21は使われて消えた筈だが, 21はLASTxというレジスタに保存されている. “ENTER”の下に“LSTx”のキーがあり, 有難いことにこれで最後のx(スタックの最上段)の21がスタック最上段に戻る. そこで“x ↔ y”をやると, スタックが21と14になる. もう一度剰余を求めると7.
まだ0でないから, “LSTx” “x ↔ y” “RMD”を再実行すると, 今度は剰余が0. 従って“LSTx”して, GCDの7が得られた. スタックの変わる様子は次のようだ. 7の下に不要になった0があるのに注意.

スタックの変化の様子

この手続きは, “RMD” “LSTx” “x ↔ y”のループを何度も回ったから, プログラムにしたくなるのは人情である. 改めてキーを見ると, (C1)に“GTO”(goto)とか, (A9)に“x=0”の判定のようなものがある. これらを使うとGCD計算のプログラムになるわけだ.
もっと複雑なプログラムについては, 私のブログparametron.blogspot.comの,「HP-16Cのプログラム技法」という話題を見て欲しい. プログラムについてはこの程度にしよう.
私のHP-16Cは, 後述の電卓を自作してから, ずーっと使わなかった. この稿を書くに当り, 動かしてみようと, 電池LR44を3個入れたが, 残念なことに, 電源が入らなかった. この原稿は, シミュレータで確かめながら, 書いている.
クレディットカード大のHP-16Cも市販されている. SwissMicroのDM16という. RPN好きな私はそれも持っている. 同じく電池切れであったが, 電池CR2032を交換したら使えるようになった. やはり小さ過ぎて見にくいとか, キーの押し心地がいまいちで, 殆ど使えない. HP-16Cと違って, Micro USBがあって, 外部と接続出来る.

SwissMicro DM16 (88mm x 59mm)

HP-16Cを長年愛用したが, あまり使わない機能も多く, 好きな機能だけ持つ個人用電卓が欲しいと思うようになった. 設計を繰り返えした結果, Webアプリとして, Happy Hacking Calculator(HHCalc)を作った. 今では私のiPhoneに入れてあり, 頻繁に利用している. HP-16Cの話のついでに, 紹介したい.

  • Happy Hacking Calculator
    https://www.iijlab.net/~ew/hhcalc.html
    (編集部より注記)現在保守はしていないため, ご利用になる際は自己責任でお願いいたします.

使い方の説明(マニュアル)は
https://www.iijlab.net/~ew/hhcmanualjp.pdf
にある. 見掛けは下の通りである.

個人用電卓Happy Hacking Calculator (設計を始めた頃の図)

 

Happy Hacking Calculatorの表示窓とキー

左上に表示用の窓があり, その下に16個の十六進法の入力キーがある. 右側には同様に16個の演算キーがある. それですべてだ.
演算キーの左1列は四則演算, 次列は基数変換用で, 上から十六進, 十進, 八進用. ただし二進はない. その列の最下段は“Ent”キー(HP-16Cの“ENTER”)である.
現在設定中の基数は, そのキーが緑なので分る(キーも色が変る). HP-16Cと似ているが, かなり違う.
ビット長さは64ビットに固定; スタックは16 段と豪勢にした; 除算と平方根は剰余も得られる; 剰余の符号は除数の符号と同じ(HP-16Cでは被除数と同じ); “Ent”だけではスタック最上段のコピーは出来ない; 八進法でも, キー“A”で八進の12が入力出来るように, 基数より大きい数のキーも使える.
プログラム機能については, 検討したことはあるが(私のブログに, 「個人用電卓のプログラミング」という話題あり.) 実装していない.
もともと単にウェブプログラムとして開発したので, iPhoneで使うと, 同じ数字を2回続けて入力した場合, 画面のズームインと扱われ, 画面が急に拡大して驚くが, 実用にはなっている.
マニュアルにはいろいろな例題がある. 通常の電卓になくて, HHCalcにあるものの1つは, 天文学者が使うユリウス日だ. −4712年1月1日を0日とした通日で, これを使うとその日の曜日が分る. 例えば, 2022年6月6日の曜日は, 十進法にして, “20220606”と入力してから, 右下の“JD”(Julian Date)を押す.
2459737がその日のJD. これに1を足し(“1” “+”を押す) , 7で割った剰余を見る(“/” “Pop”)と, 1が得られ, 月曜と判明する. 1を足したのは, 通日が0の日が月曜だったからだ.
半世紀くらい前のころ, Scientific American誌にマーチンガードナーがMathematical Gamesというコラムを連載していた. それに時々Dr. I.J.マトリックス
(https://en.wikipedia.org/wiki/Irving_Joshua_Matrix)
なる架空の数学者が登場する. 彼にはイヴァという娘さんがいて, 秘書をしているが, 話の中ではハンドバッグから出した小型計算機を使い, よく父親を助ける. その頃, そういう計算機はSFであったが, 今では当り前の世になった. 嬉しいことだが, 一方エンジニアとしては, 暗算や概算の能力は維持するように心掛けたい.

IIJ Engineers blog読者プレゼントキャンペーン
  • Twitterフォロー&条件付きツイートで、「IoT米」と
    「IIJ Engineers Blogオリジナルステッカー」のセットを抽選で10名にプレゼント!
    応募期間は2022/05/09~2022/06/30まで。詳細はこちらをご覧ください。
    今すぐツイートするならこちら→ フォローもお忘れなく!

【特集】私の愛用している技術系アイテム

IIJエンジニアが愛用している技術系アイテムを紹介。キーボードやマウスといった身近なものから、関数電卓や3Dプリンタ、工具、そしてお守りまで!?個性豊かでバラエティに富んだラインナップ。

すべての記事をみる

和田 英一

2022年05月25日 水曜日

2002年から約10年 IIJ技術研究所長. 年を取ってからは古い計算機や昔の計算法に興味が増し, シミュレーターを作ってそのプログラムを書いたり. 近頃はKnuthのTAOCPにあった問題のプログラムなどに挑戦したりしている.

Related
関連記事