« 【電子文具】電子手帳で簡易付箋紙作成機を再現する | メイン | 【日付印】平成24年6月8日 »

2012-06-07

【プチコン】小数点計算の誤差

 任天堂3DS、DSi対応ダウンロードソフト《プチコン》(スマイルーブーム)。1980年代のBASIC言語を彷彿とさせるものである。数値計算がゲーム作成言語等を標榜したのか固定小数点であり、ポケコンのように複雑な計算を試してみるにはかなりの誤差を伴う。

 こう書けば、関数電卓かパソコンを使えとお叱りを受けると思われる。ここはそれを使わずに、計算機としての使い方を考えていこう。
 《藤堂俊介の変人プログラム日記》(平成240606)にてこの記事を書いた。扱える数値が+524267~-524268、小数点第4位を四捨五入という仕様。32ビットの演算で、4096(1000H)を1.0とみなして計算させる。

 6桁、50万までなら、日常のお金の計算に十分ということで、40周年を迎えた6桁電卓《カシオミニ》よろしく、6桁の簡単な連続加算プログラムを組み、合計額に5%の消費税を加える内容にした。

 電卓で行う%計算。%キーの動作がカシオ系、シャープ系と異なる。ここは合計額×1.05で求めることにした。
 流れはこのようになる。

  1.  変数Aに数値入力用にする。
  2.  変数Bを累積用にする。
  3.  A+Bの内容をBに格納する。
  4.  繰り返す。
  5.  変数Aに0を入力すると計算終了。
  6.  合計 変数Bと、変数Bの5%増しを出力する。

 プチコンBASICにて作成し、計算もうまくいった。最後の消費税計算で思わぬ答えをはじき出した。
 

     1      1.05

     2      2.1

     3      3.149

     4      4.199

     5      5.249

    10     10.498

   100    104.98

  1000   1049.805

 10000  10498.047

100000 104980.469

400000 419921.875

 1.05を掛け合わせただけでこんな答えが。不良品だ、苦情だと怒り心頭になる前にこれが《変換誤差》がなせる業である。

 500×1.05をさせると524.902という数字が出てくる。なぜこんな数値になるのか、プチコンで次のようなプログラムを組んで計算させた。

FOR I=1 TO 4096
  X=I/4096
  PRINT I,X
  NEXT I
  変数Iに入る数字を変えて計算させていく。0.05が出力される部分の写真がこれである。

P3

 203から206を4096で割ると、0.05が出力される。この調子で、変数Iの数値を変えていき、1.05が出る部分を探していく。
P1

 すると4299から4302の範囲で1.05となる。1.05が近い値を探していく、
4299÷4096≒1.049560
4300÷4096≒1.049804
4301÷4096≒1.500488
4302÷4096≒1.502929
 近い値は4300になる。プチコンでの1.05は4300÷4096の近似値、0.05は204÷4096の近似値として表現される。524.902という数値は、500×(4096+204)÷4096で求めた結果である。関数電卓で確かめるとこうなる。

P02

 整理すると、
 人間の入力 金額×1.05
 プチコン内 金額×(4096+204)÷4096

となる。
 きちんと5%増しにするにはどうするか、0.05は20の逆数と考え、金額を20で割り、金額に足しこめば誤差は出てこないと考えた。
 そこで組んだプログラムがこれである。

P0

 合計金額+(合計金額÷20)

 こうすれば499,321円まできっちり消費税がはじける。1円未満の小数点も出てくる。切り上げるか切り捨てるかは、このプログラムは人間の判断にしている。