関数電卓コラム

08/01/19 数式通り電卓の[(-)]キー

数式通り電卓で,必ずしも必要とは言えないキーが(-)である.そしてこのキーをどのように扱うか,現代の日本の関数電卓はまだ態度を決めかねているようだ.今回はそれについて語りたい.

まず,日本の「数式通り」電卓のソフトウェアを三つに分類する.

  1. 旧Canon方式
  2. SHARP方式
  3. CASIO/Canon方式

様々な機能において,「数式通り」関数電卓は面白いようにこの三つのどれかに分類可能である.ちなみに私の手持ちの電卓では旧Canon方式はF-720i,SHARP方式はSHARPの電卓全て,そして残りがCASIO/Canon方式だ.

さて,いつぞやのコラムで書いたが,マニュアルを読まない我が校の学生達は,[(-)]キーと[-]キーを区別無く用いて小さい数を入力する.例えば,$1.5\times 10^{-6}$ を入力するのに

[1][.][5][EXP][-][6]

と打つ.このとき,それぞれの電卓はどう反応するだろうか.

表1: 間違った入力に対する各方式のレスポンス

旧Canon方式 Syntax error  
SHARP方式 $-4.5$ (1.5-6と解釈される)
CASIO/Canon方式 $1.5\times 10^{-6}$  

このように,設計思想により解はばらばらだ.もし,[(-)]キーと[-]キーの意味を厳密に解釈するなら,旧Canon方式のようにこれはエラーとするのが正しい.しかし,「数式通り」関数電卓に本当に(-)キーは必要なのか?答は「否」である.パソコンのキーボードを思い浮かべて欲しい.数式を入力し,答を求めるシチュエーションは数多くあるが,別に[(-)]キーが必要になることはない.要するに,[-]がどこで入力されたかによりそれは符号のマイナスなのか演算子のマイナスなのか確実に区別できるのである.

では,なぜ「数式通り」電卓に二つのキーがあるかというと,これは「標準電卓」の名残が残っていると考えるのが妥当だ.標準電卓においては,演算子が「どこで置数を終えたか」のサインになるので,演算子でもある[-]キーに符号切り替えのマイナスを兼ねさせるわけにはいかない.説明をわかりやすくするために構文チャートで示そう.

図1: 標準電卓における数値入力の構文チャート

このように,置数からなにかを引きたいときには[-]キーで置数状態から抜ける必要があるため,[(-)]キーと[-]キーはどちらも必要になる.また,[(-)]キーは何度押しても構わない,「状態反転」の機能を持っていることに注目しよう.つまり,何度も[(-)]キーを押したときの動作は,単純に,表示されている数の符号を入れ替えるだけで良いわけだからこのような動作は問題なく許される.このように,標準電卓においては[(-)]キーと[-]キーはそもそも「置数から抜けない操作」と「置数から抜ける動作」に明確に分かれているため混乱が少なかった.逆に,この特性から[(-)]キーは「数値入力」の状態にならないと機能しない.直感的には正しい[(-)] [1] [2]...の様な入力は「標準電卓」では許されないのだ.


ところが,「数式通り」電卓は,置数がそのままディスプレイにあらわれる.[(-)]キーも[-]キーも打つとマイナス記号が表示されるため,これに矛盾しないような電卓の動作を考える必要があった.旧Canonの設計者は,標準電卓と同様[-]キーは演算子,[(-)]キーは符号切り替えと厳密に解釈する道を選んだ.すなわち以下の方式である.

図2: 旧Canon方式の構文チャート

この方式では,符号切り替えのマイナスは見た目に正しい位置に置かなければ文法エラーとなる.しかも,[(-)]キーと[-]キーの意味は厳密に区別されているため,プログラム的にも楽である.

具体的には,5×(-3)のような演算は習慣的に

[5] [×] [-] [3] [=]

と打ってしまいたい気持ちがあるが,これを好意的に5×(-3)と解釈するのはソフトウェア的な処理が面倒くさい.単に「演算子が二つ続いたらエラー」というルールにしておけばここは

[5] [×] [(-)] [3] [=]

のみを考えればよいのである.この方式は,融通が効かないが数式通り電卓に[(-)]キーと[-]キーの両方を置く以上は論理的に正しい考え方である.


さて,同じ問題をSHARP技術陣はどう解決したか.彼等は,置数が終わるまでは表示は大きいディスプレイで行い,ルールは「標準電卓」と同じとするという方式を編み出した.例えば1.23E-4の入力は,

まず1.23.ここで[EXP]キーを押すと,こうなって,あとは演算子を入力するまで何度でも数字キー,[(-)]が打てる.もちろん,[(-)]キーは標準電卓と同様の符号反転機能.構文チャートは図1とよく似ているが,始めに[(-)]を打ってもきちんと認識されるところが進歩している.

図3: SHARP方式の構文チャート

このように,置数が終わるまでは一時的な表示にとどめておく方式には副次的メリットがある.たとえば5×(-3)をやってみると,

[5] [×] [(-)] [3] [=]

と自動的に括弧が挿入される.なかなか気が利くではないか.ちなみにSHARP方式も当然ながら[(-)]キーと[-]キーの使い分けには厳密で,

[5] [×] [-] [3] [=]

はエラーとなる.一見素晴らしいこの方式,原理的に解決が難しい問題がある.それは,deleteキーでどのように戻るか,ということだ.例えば「1.23E3-」まで打ってdeleteキーを押すと,[-]キーで確定した上のディスプレイ上の数値が消えて行く.

そして,そこから数値を入力すると,上のディスプレイに直接置数が表示される.

つまり,置数が確定するまでは下の表示,という原則が常に守られるわけではない,と言う弱さがある.たぶんSHARP開発陣はこの問題ではかなり悩んだと思う.かつての機種(EL-509V)では,いちど確定した置数はdeleteキーでは戻れない,というルールになっていた.論理的にはこの方が正しいのだろうが,恐らくユーザーからの非難の声にこたえ,場当たり的な対応を取ったのだろう.なんとも美しくない.SHARP方式を完全ならしめるなら,置数が確定した後にdeleteキーが押されたら,打ちかけの置数が下のディスプレイに復活するべきである.

置数が確定するまで一時表示する方式の問題はもうひとつあって,表1の様な入力に対してエラーでなく間違った解釈を返す,ということだ.これは,演算子[-]が来たところで「置数終了」という判断がなされ,X.XXE00という置数がされたと判断されてしまうため,つぎの(入力者が指数と思っている)数値を引いてしまう,と言うことになる.まあ,これは簡単なエラートラップルーチンで防げる類のものだが,例外処理を忘れるとこうなる.ルールに例外を持ち込むのはプログラマーとしては忸怩たる思いだろうが,ここはきちんと「エラー」としなければ.


さて,最後に現在のCanonおよびCASIOの入力方式について見てみよう.両者には多くの共通点があり,おそらくCASIOの技術がCanonに伝えられたと私は考えている.特徴は,[(-)]キーが押されるべき所に[-]キーを押しても正しく認識する,ということだ.これは図2の旧Canon方式の[(-)]のところが[-]でもエラーにならない,ということを意味する.

図4: CASIO/Canon方式の構文チャート

こうなると,本来[(-)]は無くても良いはずなのだが,そこまでは思い切れなかった.やはり,「標準電卓」方式から乗り換えたユーザーをないがしろにできなかったのだろうか.上のような置数ルールを取る場合の欠点は,見た目がおかしい数式も許されてしまう,ということだろうか.例えば5×(-3)は

[5] [×] [-] [3] [=]
[5] [×] [(-)] [3] [=]

どちらも正しい答え,-6を表示する.それどころか,以下の形式も許される.

[5] [×] [-] [-] [3] [=]
[5] [×] [-] [-] [-] [3] [=]

答はそれぞれ15,-15になる.すなわち,CASIO方式では,入力された[-]キー,あるいは[(-)]が符号反転の位置にあるときは,それが何個繋がっていても符号反転の機能を果たす,と言うルールになっている.一方,以下のような入力に対しては,一つ目の[-]を演算子に,二つめ以降を符号反転子と解釈していることが計算結果からわかる.

[5] [-] [-] [3] [=]

(答え:8)

[5] [-] [-] [-] [3] [=]

(答え:2)

こう考えると,アルゴリズムは明快だ.逆に,[(-)]を演算子の代わりに使えるかどうか試してみたが,これはダメだった.

[5] [(-)] [3] [=]

→Syntax error


以上,日本の「数式通り」関数電卓における[-]キーと[(-)]の取り扱いについて見てきたが,どれも過去の「標準電卓」との繋がりを断ち切れないゆえの歯がゆさが残る仕様である.また,詳しい解析と歴史的経緯を見ると,関数電卓設計者の苦労が垣間見えるようである.

で,私が「数式通り」の入力方式を設計するなら,CASIO方式をベースに[(-)]キーを取り払いたい.どうせ,無くても良いものだから.あと,置数確定まで一時的表示する方法は,deleteキーとの相性が原理的に悪いので疑問.

この場合,どうしても避けられない欠点として,「ラストアンサーから何かを引きたいとき」にキー操作が一つ増える.たとえば[Ans]-3は現行電卓の場合,

[-] [3] [=]

私が提唱する[(-)]キーレス方式だとどうしても

[Ans] [-] [3] [=]

となる.しかし,これは小さな犠牲ではないか.ShiftキーとAlphaキーのコラムでも書いたが,同じ機能を果たすキーが重複して存在するというのは,入力デバイスとして完成されたものとは言えない.

最後に,デザインに関するサン=テグジュペリの言葉を引用しよう.

「何においてであれ『完全』とは、すべてを脱ぎ去り、ありのままの姿に戻ったとき、つまり、加えるべきものがなくなったときにではなく、取り去るものがなくなったときに達成されるのである」