2007.06.16
  • twitter
  • facebook
  • はてなブックマーク
  • 印刷

2進数を使うということ

株式会社オーグメント 代表取締役 渡辺 俊雄

前回、エクセルを使って“=1.1-1-0.1”と“=(1.1-1-0.1)”の計算をやってみてくださいとお願いしました。その結果はいかがでしたでしょうか。おそらく、前者の結果はゼロとなり、後者の結果は“8.32667E-17”(私たちが普段使う小数点表記で示すと“0.0000000000000000832667……”)という値になったと思います。

人間から見た場合、上記の二つの式はまったく同じ結果にならないといけないはずなのですが、なぜ同じにならないのでしょうか。今回からは、この話をしていきましょう。

一般に、10進数とか2進数といった場合には、主に記法が違うだけで内容に違いはないと思われがちです。これは、よく示される例が、10進数の2を2進数で示すと“10”だとかいうように自然数を例にしたものが多いからかもしれません。正直、この程度の基数変換であれば数学的知識がそれほどなくても容易に説明できますから。^^;

しかし、基数が変わるということは、実はそれほど単純なことではありません。その具体的な例として、小数がどうなるかを示してみましょう。以下、0.1、0.2、0.3、……、といった数字がどのような値になるのかを確認してください。

# ここでの中括弧“{ }”は、同じ数字が繰り返されるのをわかりやすくするために挿入しています。

  0.1  0.0001100110011……    ← 循環小数となります
      0.0{0011}{0011}{0011}…… ← { } の間が繰り返されます
  0.2  0.001100110011……
      0.{0011}{0011}{0011}……
  0.3  0.0100110011001……
      0.0{1001}{1001}{1001}……
  0.4  0.011001100110……
      0.{0110}{0110}{0110}……
  0.5  0.1
      0.1
  0.6  0.100110011001……
      0.{1001}{1001}{1001}……
  0.7  0.1011001100110……
      0.1{0110}{0110}{0110}……
  0.8  0.110011001100……
      0.{1100}{1100}{1100}……
  0.9  0.1110011001100……
      0.1{1100}{1100}{1100}……

いかがでしょうか。0.5を除くと、他の少数のすべてが循環小数となってしまいました。これでは、普通に考えて計算ができなくなります。だって、無限に続く桁を処理するには無限の時間が必要になりますから。(苦笑) 一見すると問題がなさそうでも、実はこういうことが起こるのです。

さて、循環小数では桁が無限に続くことになります。しかし、コンピュータが計算できる桁には限りがありますから、無限に続く少数をどこかで切り捨てなくてはいけません。この処理は通称「丸め」と呼ばれますが、その結果として誤差が含まれることになります。普段の授業でも、円周率をどうするかとか、小数点以下の有効桁数を何桁にするかで答えが変わってくるケースはいくつもありますよね。これと同様で、数値を切り捨てることで、その計算結果に多かれ少なかれ影響を与えてしまうのです。

本日は、ここまで。次回は、もう少し詳しく説明します。(^^)

渡辺 俊雄(わたなべ としお)

株式会社オーグメント 代表取締役
1958年、東京生まれ。メーカー系システムエンジニア、大手コンピュータ出版社の書籍編集者、インターネット関連組織の広報などを経て2006年に独立。大学生と高校生の二人の子どもを持つ。

ご意見・ご要望、お待ちしています!

この記事に対する皆様のご意見、ご要望をお寄せください。今後の記事制作の参考にさせていただきます。(なお個別・個人的なご質問・ご相談等に関してはお受けいたしかねます。)

pagetop