関数電卓コラム

11/06/03 CASIO/Canonの[RCL],[STO]機能の歴史に関する考察

1. 発端

おかげさまで,このコラムに関する様々な感想がメールで送られてくる.今回は以下のような興味深い内容だった.

はじめまして。

・・・


大変に僭越ながら、先生のコラム
07/10/09 関数電卓のバグ(メモリRCLとラストアンサーの競合)内の Canon F-788dx の記載は

> >Canonの現行機種にもメモリRCLバグが存在する,と訂正する必要がある.
となっていますが、788dx ではRCLバグは解決しており、

【メモリSTOバグが存在する】

に修正されるべきではないでしょうか?

すでにご承知でしょうが、F-788dx が遠藤先生の例題をクリアし、
井本先生の例題をクリアできない理由は
メモリ[RCL]バグではなく、[STO]バグが原因と考えます。

ここで言う「コラム」は,私が「CASIOとCanonの『数式通り』」にはバグがある」と指摘した07/10/09の記事だ.その後,数度のやりとりの上,当時の記事の何が間違っていたのかがはっきりした.その過程でCASIO,Canon(CanonのソフトはCASIOのOEMと推測される)の「数式通り」に「バグ」と呼ばれる現象が生じたのか,そしてそれがどのように改善されていったのかが明らかになった.関数電卓のユーザーインターフェースを語る上で重要な知見と思われるのでここに記したい.

2. 問題の定義

本稿では,関数電卓がユーザーの期待したとおりに動作しないことを「バグ」と定義した.

問題1: 以下の操作において,関数電卓がユーザーの期待した解を返さない(RCL機能テスト)

[2] [STO] [A]
[2] [×] [3] [=]
[RCL] [A] [+] [1] [=]

2がAに代入される
答:6
答:3となることが期待されるが7になる.

問題2: 以下の操作において,関数電卓がユーザーの期待した解を返さない(STO機能テスト)

[1] [+] [1] [=]
[+] [3] [=]
[STO] [A]

2がラストアンサーメモリに代入される
答:5
Aには5が入って欲しいが8が代入される

3. 「数式通り」電卓の世代

さて,ここで私が持っている「数式通り」電卓を世代に分類しよう.

第ゼロ世代:バグ以前に,[RCL]キーの挙動が以降のモデルと全く異なる
第一世代:問題1,問題2ともにバグ動作をする
第二世代:問題1はユーザーの期待通りに動作するが,問題2はバグ動作
第三世代:どちらの問題もユーザーの期待通りに動作する

第ゼロ世代 Canon F-720i
第一世代 CASIO fx-991W
CASIO fx-350TL
CASIO fx-991MS
CASIO fx-290
第二世代 Canon F-788dx
第三世代 Canon F-715S

一応,上の表のように関数電卓を「世代」に分類したが,本当にこれが発売時期,言い換えればソフトウェア発展の歴史に一致するかどうかは証拠がなく,推測に頼っている.

「Natural Display」電卓は分類すれば全て第三世代となる.CASIOの現行モデル,fx-290は発売時期こそ新しいが,中身のソフトウェアはfx-350MSと同じで,第一世代に属する.

3. 「数式通り」電卓の[RCL]キー,[ALPHA]キーの機能と動作

「数式通り」関数電卓にはメモリを呼び出す二つのキーがある.一つは[RCL],もうひとつは[ALPHA]キーだ.どちらも[RCL][A],[ALPHA][A]などと,アルファベットキーと組み合わせて使う.この方式はCASIOが2行表示のSVPAM方式を開発したときからの伝統である.

ちなみに,移行期に当たるfx-991s(VPAM方式)には[ALPHA]キーはない.

[RCL]キーの機能は,「いまメモリに入っている値を確認する」というものだ.一方,[ALPHA]は数式中に変数を代入するためのキーで,両者の役割は異なる.はじめ,設計者は[RCL]キーを押すと現在のメモリ内容が表示される機能を素直に実装した(CASIO関数電卓にこの世代のものが無いので推測である).この場合,計算の途中だろうが何だろうが,[RCL]キーを押した瞬間にメモリの内容が表示される.これが第ゼロ世代の「数式通り」である.

4. [RCL],[STO]キーの進化(?)の歴史

ところが,ユーザーは[ALPHA]キーのつもりで[RCL]キーを押してしまうことがよくあると言うことがわかった.この場合,一生懸命入力してきた計算式が消えてしまうという悲劇が起こる.メーカーはこれに対応するため,数式の途中で[RCL]キーが押されたら[ALPHA]と同じ機能と解釈するよう例外を設けた.現行のCASIO,Canon電卓にもある[-]キーを[(-)]と同一視するのと同じ思想だ.ちなみに,私はこういった「曖昧さ」は結果としてユーザーのためにならないと思っている.CASIO,Canonの悲劇はここから始まった.

「数式通り」電卓で例外なく実装されなくてはならない機能が二つある.

  1. [STO]キーには現在表示されている数式を確定させる機能を持たせる.つまり[1] [+] [1] [STO] [A]とやったらメモリAには2が代入されるべきである.
  2. 解が確定した状態([=]キー打鍵直後)に演算キーを押したら,それは直前の計算結果,つまりラストアンサーに対する演算と解釈するべきである.
    例:[1] [+] [1] [=] 答:2
       [+] [3] [=]   答:5

[RCL]と[ALPHA]の機能を曖昧にしたおかげで,上記の「数式通り」の大原則と[STO] [RCL]機能が衝突するようになってしまったのが第一世代というわけだ.

問題1を考えてみよう.[2] [×] [3] [=] のステップではラストアンサーには6が入る.そして,次のステップ,[RCL] [A] は単なるメモリ内容呼び出しで,これは計算式とは独立した操作と見なされる.従って,計算式は[+]から始まったと解釈され,これは直前の[2] [×] [3] [=] の解,6をラストアンサーとした計算となるわけだ.したがって表示は

「Ans+1」

となり,これは関数電卓に実装されたロジックとしては何ら間違っていない.しかし,ユーザーの立場からするとこう見える.

[RCL] [A] [+] [1] [=]だと答えが7になり,[1] [+] [RCL] [A] [=]だと答が3になる.

これはバグではないか,と.

そこでエンジニアは考えた.「[RCL]キーで値を呼び出したときに,ラストアンサーを書き換えてしまえば問題は解決するだろう,と.そうして生まれたのが第二世代である.この場合,

「Ans+1」

のステップでラストアンサーに入っているのは呼び出されたメモリAの値であるから,答は期待されたとおり3となる.ほっとしたのもつかの間,第一世代から存在するもうひとつの問題が解決されていないことがユーザーからの指摘で判明した.それが問題2である.

問題2は何が問題なのかというと,「ラストアンサーを含む数式を[STO]キーで再評価するとき,ラストアンサーには前回評価されたのと違う値が入っている」という問題である.今の場合,[STO]キーが押されたから数式を評価する,というのはロジック的には間違っていないのだが,その数式が[Ans]を含むため,自分自身を再評価してしまうことになるわけだ.すなわち,[+] [3] [=]のステップで,ラストアンサーには5が格納され,次に押された[STO]キー入力に対して電卓は

・[STO]の機能は「演算を確定してその結果をメモリにストア」だから,数式エリアに表示されている「Ans+3」を確定し,メモリAに入れる
・ラストアンサーは直前の計算結果,5だから,メモリには5+3=8が入るべきである

という動作を行う.またしても電卓は間違いを犯していないのだが,ユーザーを裏切ることになる.この辺の矛盾を見ると,アシモフの「我はロボット」を彷彿とさせる.

問題2の計算は,もともと「Ans+3」という計算をメモリAに入れたければ,[+] [3] [STO] [A]と打たなければいけないのだ.責められるべきは人類の怠慢なのだが,人間が機械に合わせなくてはならないというのは納得が行かぬ.またもやユーザーからの文句を受けて,エンジニアは以下のように仕様を変更した.

「解確定状態で[STO]が押されたときは数式を評価せず,解をメモリに代入するよう例外を設ける」

こうして生まれたのが第三世代の「数式通り」である.第二世代と第三世代の設計思想の違いは以下の計算を行えば明らかである.

[1] [+] [1] [=]
[STO] [A]

第一世代(fx-290) 第二世代(F-788dx
第一世代(F-715S)

こうして,現行のCASIO,Canonの関数電卓には我々が「バグ」と呼んでいた,電卓の正直な挙動は見られなくなった.一方,SHARPの関数電卓はCASIO,Canonとほとんど同じユーザーインターフェースを持ちながら全く別の方法で早期にこの問題を収拾している.少なくとも私の持っているモデルに,上記で指摘されたような問題は見られない.

問題1に対するSHARPの解決方法は以下のようなものである.

まず,[STO][8]でメモリに8を代入.続いて,[RCL][A]を押すと,メモリAの内容が確認できる.


[RCL][A]でメモリ内容を確認

ここで,[+][3][×][2][=]と計算を続けると,自動的に表示はA+3×2に切り替わる.


Aの値を使い計算

まさしく,シャープな解決方法と言えよう.

問題2に対してはどうかというと,SHARP機もCASIO/Canonと同様,「数式確定直後は[STO]キーで数式を評価しない」とすることで問題を解決している.

[1] [+] [1] [=]
[STO] [A]
[1] [+] [1] [STO] [A]
SHARP EL-509E SHARP EL-509E

こちらに関しては,確定状態で[=]キーを押したときと[STO]キーを押したときの挙動が異なってしまうと言う副作用があるが,どのメーカーもこれ以上の解決策を見いだせなかったのだろう.

以上が,「関数電卓パーフェクトガイド」にも記載されていた「バグ」と呼ばれる現象が何故出現したのか,そしてそれはどのように解決されてきたのかに関する私なりの推理である.

ことメモリに関して言えば,ユーザーインターフェースは明らかにSHARP方式が優れているのだが,SHARP方式も,メモリのストア,呼び出しが[ALPHA]キーでも可能になっており,ユーザーに曖昧な選択を残している.両者を越えた新しいUIを持った関数電卓の登場を切望する次第である.