2019年7月18日木曜日

電卓の有効桁の処理

電卓の小数点などの処理を実装しようとしたところ、そもそもがその処理を理解していないことに気がつき、いろいろと調べてみました。

初めは、Doubleとかの不動小数点について調べましたが、どうやら2進数での有効桁とかなんとか、ということで、10進数化したエンジンとは別の話になりそうなので、深くはみませんでした。

次に、数学的な有効数字と丸めについても調べましたが、結局それらら「測定値」の話であって、測定値かどうかが明確でない電卓の問題ではなさそうなので、とりあえず見送りました。もっとも、測定値を前提とする有効桁の機能を設けると、その世界ではニーズはありそうですが、ユーザ数も限られるのでとりあえず見送りとしました。

結局は電卓の取り扱い説明書で、どのような表示になるのか確認しようとしましたが、エラーの話がちょっと出ているだけで、これも役に立ちませんでした。

そうこうして、調べるなかで、「統計学 細く文書 電卓の使い方」という謎の文書が登場してきました。それがこれです。

http://www.sguc.ac.jp/i/st/learning/statistics/calculator/index1.pdf

すると、さらに知らなかった電卓の裏機能の解説が満載。どうやらカシオ系とシャープ系でそれぞれ操作が違うようです。ぱっと見はシャープ系の方が余計な操作が不要っぽいので、シャープ系の方がよさそうな気がしますが、とりあえず裏機能の実装は優先度を下げて、表示機能に焦点を当てます。

(1)オーバーフロー
電卓は桁が決まっている点が、普通のコンピュータでの演算と違うところです。そういう意味ではdecimal演算とNumberFormatterとの相性はいいかもしれません。

12桁で1000億円の計算ができるで、一般の利用には十分かと思うので、とりあえず12桁でいきますかね。

で、オーバーフローはとりあえず例で示されていました。

1234567x1234567=

で12桁の場合は、こんな感じになりそうです。

E 1.52415567748

この小数点は桁あふれということらしいです。計算値は「1524155677489」なので、この9があふれたということを示しています。

(2)オーバーフローの判定
問題はあふれたかどうかの判定をどう計算するか、ですね。「1000000000000」以上かどうかで判定し、あふれ桁は割った結果で判断という感じですかねぇ。ちょっと複雑そうなので桁あふれ判定オブジェクトを作ってみたいと思います(電卓の中はどうなっているんだか想像できないすけど・・)。

(3)オーバーフロー後のエラー処理
桁があふれた場合、ACなどのキーを押さない限り、処理はストップするようです。桁あふれでCを押すとエラーだけが解除されるそうですが、そのあとの処理は、カシオとシャープで異なるようです。どう違うかは謎ですが、そのまま計算させるのがいいのかもしれません。

(4)小数点以下の桁あふれ
ちなみに小数点の場合は、あふれ桁は切ってしまうようです。

1.234567x1.234567 =

「1.52315567748」ですね。9が切られます。

(5)小数点以下の桁あふれの処理
解説にはこの最後の桁の処理をどうするのかはかかれていないのですが、とりあえず「切る」でいいかと思います。
ただフォーマッターでは四捨五入をしていたような気がするので、桁あふれ部分の標準は四捨五入でいいような気もします。

(6)小数点以下の桁あふれに関連する処理
巻紙電卓では、これまで通常(デフォルト)の浮動小数モードFだと、小数点処理を明示していなかったのですが、5/4を表示させたいと思います(これまで4/5になっていた・・誰か指摘してくれよ・・)。だた結局はCUTモードやHIDEモードを作らなくてはいけないので、作る必要があるのには変わりないんですけどねぇ。


ということで、桁の処理については大凡の機能は固まりました、次回はその実装です。




0 件のコメント: