| チェックポイント 前回はコンピュータの扱う2進数を我々の扱う10進数へ変換してみました。 今回は逆に10進数を2進数に変換してみます。 ここでは変換を覚える必要はありませんが、なぜこの様な知識が必要なのかは覚えておいてください。 プログラミングする際に必要な知識とつながっています。 |
まず整数の10を2進数に変換してみます。
変換する場合は2で割っていきます。
このときの商と余りを記述します。
10 ÷ 2 = 5 … 0
商は5なのでまた割ります。
5 ÷ 2 = 2 … 1
商は2なのでまだ割ります。
2 ÷ 2 = 1 … 0
これで商がになりました。
ここまで計算します。
10 ÷ 2 = 5 … 0 ←④
5 ÷ 2 = 2 … 1 ←③
2 ÷ 2 = 1 … 0 ←②
↑
①
①から④へ順番に左から右へ書き直します。
①②③④
↓↓↓↓
&B1010
すると2進数に変換されています。
では実数の場合はというと、実数の整数部は整数なので上の方法で変換できます。
小数部も理論的には同じなのですが変換する方法を変えてみましょう。
たとえば少数0.75はどうなるでしょうか?
この場合1を2で割っていきます。
その商が変換する値から引けた場合には引いて1を横に記述します。
引けないときは0を記述していきます。
小数部の計算終了は2進数何桁目まで計算するかで決まります。
ここでは4桁まで計算してみましょう。
0.75
まず 1 ÷ 2 = 0.5 - 0.5
────────
0.25 引けたので … 1 ←①
0.5 ÷ 2 = -0.25 - 0.25
────────
0 引けたので … 1 ←②
今回は4桁計算する前に0になったので終わります。
これを①から②へ順番に左から右へ書き直します。
すると1100となります。
たとえば実数10.75の場合、整数部が2進4桁、小数部が2進4桁であらわされていたら、
&B1010▲1100 となります。(▲が小数点だとすると・・・)
プチコンの場合には小数部が12桁になります。
では本題の0.1はどうなるか…
1 0.1
÷ 2 - 0.5
──────────────────────────────
0.5 0.1 引けなかった 0
÷ 2 - 0.25
──────────────────────────────
0.25 0.1 引けなかった 0
÷ 2 - 0.125
──────────────────────────────
0.125 0.1 引けなかった 0
÷ 2 - 0.0625
──────────────────────────────
0.0625 0.0375 引けた 1
÷ 2 - 0.03125
──────────────────────────────
0.03125 0.00625 引けた 1
÷ 2 - 0.015625
──────────────────────────────
0.015625 0.00625 引けなかった 0
÷ 2 - 0.0078125
──────────────────────────────
0.0078125 0.00625 引けなかった 0
÷ 2 - 0.00390625
──────────────────────────────
0.00390625 0.00234375 引けた 1
え~・・・この時点で計算ミスしてるかもしれません^^;
計算はまだ続きます。
が・・・ここら辺で勘弁をm(__)m
ここまででわかってもらえますか?
このままだと12桁まで計算しても計算が終わりそうに無いことが・・・
そうです!
終わりません^^
その分は誤差として切り捨てられます。
ですから0.1を10回足して1にならないのはこの誤差のせいです。
少数つきで計算する場合このことを頭に入れておかないとループが終わらない無限ループというバグを生み出すことになります。