2進数と10進数の関係はどうなっていますか?【小数部編】

記事
IT・テクノロジー
前回のブログでは、「2進数と10進数の関係」を「整数の数値」で説明しました。簡単な仕組みでしたよね。

今回は、「小数点以下(小数部)の2進数と10進数の関係」を説明します。
2進数は、0と1で数値を表すので
前回の復習で、例えば、
2進数「0001」→10進数「1」
2進数「0010」→10進数「2」
2進数「0011」→10進数「3」
2進数「0100」→10進数「4」
2進数「0101」→10進数「5」
と言うように2進数はどの桁が「1」かによって10進数の値がわかります。
よく見ると規則性があり、2進数の1桁目から2桁目で10進数の倍数(二乗値)の「2」になり、3桁目で10進数の倍数(二乗値)の「4」になり、4桁目で10進数の倍数(二乗値)の「8」になります。
あとは「1」になっている桁の二乗値をおのおの足すと10進数に変換できます。


その逆で、小数部の2進数は、整数とは逆で小数部の桁が増えるほど半分の値(マイナスの二乗値)になります。
小数点の左側の整数部は「0」として、
2進数「0.1」→10進数「0.5」
2進数「0.01」→10進数「0.25」
2進数「0.001」→10進数「0.125」
2進数「0.0001」→10進数「0.0625」
2進数「0.00001」→10進数「0.03125」
に半分(1/2)の値になります。

2進数の小数部の「1」の桁が増えると10進数では半分(1/2)の値になりますので、
2進数「0.11」は、10進数の「0.5 + 0.25」で「0.75」になります。
2進数「0.101」は、10進数の「0.5 + 0.125」で「0.625」になります。
2進数「0.111」は、10進数の「0.5 + 0.25 + 0.125」で「0.875」になります。
2進数「0.1111」は、10進数の「0.5 + 0.25 + 0.125 + 0.0625」で「0.9375」になります。


小数部の2進数も仕組みは簡単なんですが、そこには大きな問題があります。
例えば10進数の「0.1」を2進数で表す場合は、2進数「0.000111」では
2進数「0.0001」→10進数「0.0625」
2進数「0.00001」→10進数「0.03125」
2進数「0.000001」→10進数「0.015625」
を全部足すと10進数で、「0.109375」と「0.1」より大きな数字になってしまうので

それより小さい2進数「0.00011」では、
2進数「0.0001」→10進数「0.0625」
2進数「0.00001」→10進数「0.03125」
を足すので「0.09375」で「0.1」には不足した値になってしまいます。桁数を増やしてもっと小さな値を足していってもやはり正確な「0.1」にはならないんですね。

コンピュータの内部では2進数で計算処理が行われていますので、実際このような「誤差」が発生しています。
これを「循環小数」(円周率と同じように、ある桁から先で数字の列が無限に繰り返される小数)になってしまう現象と言います。

よくプログラムでバグ(不具合)が発生する一例として2進数で10進数の「0.1」を表す「0.00011~」を10回加算しても10進数の「1.0」にならない。という問題「 0.999~ 」にしかならないは、このような仕組みで起きていたんですね。

ITエンジニアとしては、コンピュータ内部ではこのような仕組みで処理が動いている事とその問題点を理解したうえでプログラミングを行う必要があります!

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す