2019年3月27日水曜日

練習問題(エクセルの限界に挑む)

(1) 2進数の整数 101010 を10進数で表すと( ① )であり、2進数の小数 0.101 を10進数で表すと( ② )である。また、16進数の2桁の整数 AB を10進数で表すと( ③ )である。

(2) エクセルで 1/3 を足し続けたらどうなるかを実際に試してみた。まず A 列に上から順に 0,1,2,3,… と入力した。また B 列と C 列を小数点以下20桁まで表示するようにした。
 次にセル B1 に 0 を入力し、そこに 1/3 を足した値をセル B2 として、その式を下方向にコピーしたところ、下表のようになった。

ABCD
100.000000000000000000000.00000000000000000000
210.333333333333333000000.33333333333333300000
320.666666666666667000000.66666666666666700000
431.000000000000000000001.00000000000000000000

21206.666666666666660000006.66666666666667000000×

12812742.3333333333334000000042.33333333333330000000×

14214147.0000000000001000000047.00000000000000000000×


ところで、10進数の 1/3 を小数に直すと、右の計算により循環小数になる。これを「0.3」と表す。上表のセル B1 ~ B2 をみると、途中で四捨五入されているが、小数点以下15桁くらいまで正確に表示されていることがわかる。
 さて、その関数式をさらに下方向にコピーしてみたところ、何か所かで計算が合わないところが見つかった。ところで、計算が合わないところを目で探すのは意外と難しい。そこで、エクセル自身にそれを発見させるようにしよう。そのために、まず A 列の各セルに 1/3 を掛けた値を C 列の同じ行に表示させることにした。これが四捨五入したときの正しい値で、いわば理論値にあたる。その上で、IF 関数を使って、B 列と C 列の値が異なれば D 列に 「×」 を表示させ、同じ値なら D 列に何も表示させないようにした。こうすればどこで誤差を生じたのかが一目でわかる。
 ところで、なぜ誤差が生じるのだろう。それは10進数の1/3を2進数の小数で表してみるとわかる。エクセルでは10進数を入力して、計算結果を10進数で表示するが、計算そのものは2進数で実行しているからである。

① 上表のセル B2 , C1 , D1 に入る関数式を書きなさい。
  ただし、下方向にコピーして正しく動く式を答えること。
                                        
② 10進数の 1/3 を2進数の小数で表しなさい。
  ただし、 循環小数になる場合は「0.1001」のように表すこと。



《解答》
(1) ① 42  ② 0.625  ③ 171
(2) ① B2  = B1+1/3
     C1  = A1*1/3
     D1  = IF (A1=B1 , "" , "×")
   ②     0.01


 →  →  →  →  → 

0 件のコメント:

コメントを投稿