16進電卓を作ってみよう8
コンピュータは、その昔「計算機」と訳されていたようです。
数字を扱うのが主目的だったからでしょう。
毎度、管理人イガジーです。
今ではコンピュータは、通信装置であり、記憶装置でもあり、
色々なモノの中に存在する身近なものになりました。
さて、計算するプログラムを作る際には、有効桁や誤差を
意識しなければならないことがあります。
昨日の最後に書いたように、今作成している16進電卓は
12345678901 と入力すると −539222987 になってしまいます。
これは、有効桁あふれ(オーバフロー)という現象です。
Java の int という「型」は、符号付き 32bit なので
扱える数値の範囲は、 -2147483648 〜 +2147483647 です。
普通は、これくらいの範囲の数が扱えれば十分なのですが
電卓プログラムなどでは、意地悪されると期待と異なる結果を出してしまいます。
昨日のプログラムを動かして、2147483647 + 1 を入力してみると
-2147483648 になる事が確かめられるでしょう。(エラーにはなりません)
では、どうしましょうか。
(a)扱える範囲を広げる(int → long にする)
(b)ある範囲を超えてしまったらエラーを表示する
(c)何もしない
long は、(Javaの場合) 符号付き 64bit で、扱える範囲は
-9223372036854775808 〜 +9223372036854775807 になります。
これだけ広い範囲が扱えりゃ、もう十分だろうと(a)+(c)で終り。
とするのもひとつの手です。というのも(b)は面倒だからです(^^;)
long にするには、次のように太字の部分をint → longにします。
long result=0,val1=0;
long calc(){
long rv=result;
if (stat==ADD) {
rv=val1+result;
}else if (stat==SUB) {
rv=val1-result;
}
return rv;
}
void display(){
String rs;
if (radix==10) rs=Long.toString(result);
else rs=Long.toHexString(result).toUpperCase();
dsp.setText(rs);
}
「型」のみの変更で済むので簡単です。
(b)のオーバーフロー対策は、
数字キー(nBtn)と、演算(calc())に範囲チェックを追加し
オーバーフロー状態であれば、表示(display())でエラーを表示し
[CLR]キー以外は受け付けなくする
という処理が必要になります。
具体的な例は、省略しますので、やってみてください。
また、足し算、引き算以外に、論理演算(NOT/AND/OR)や
掛け算、割り算を自力で追加してみるのも良い練習になるでしょう。
(割り算は、小数点処理が必要になるのでいささか面倒です)
16進電卓(もどき)を作りながらプログラミングに慣れる連載は
今日でひと区切りとします。※ もう1回追加して
オーバーフローチェックを入れたプログラム例も掲載しました。
内容はいかがでしたでしょうか?(難しかったでしょうか?)
ぜひ、率直なご意見、ご質問、ご感想などをお聞かせください。
こちらからどうぞ→メールフォーム
16進電卓を作ってみよう1
16進電卓を作ってみよう2
16進電卓を作ってみよう3
16進電卓を作ってみよう4
16進電卓を作ってみよう5
16進電卓を作ってみよう6
16進電卓を作ってみよう7
16進電卓を作ってみよう8(this)
16進電卓を作ってみよう9
この記事へのコメントはこちら