パソコンも計算間違い 0.1+0.1+0.1=0.3じゃない!?『文系プログラマーのためのPythonで学び直す高校数学』から

続いて、小数である0.625を2進数にしてみましょう。小数については、「2で割る」のではなく「2を掛ける」計算をします。具体的には、0.625を2倍つまり0.625×2と計算します。結果は1.25です。この整数部分の1が2-1の桁の値になります。次に、1.25の小数部分である0.25を2倍して整数部を2-2の桁の値に……と順々に計算して、小数部が0になったところで終了です。

10進数の0.625を2進数に直す(同書p.38より)

元の10進数が「26.625」だったら、整数部分と小数部分をそれぞれこのように計算して「11010.101」と変換すればいいのです。では、元の10進数が「0.1」の場合はどうなるでしょうか?

実は0.1は2進数ではぴったりには書き表せない数なのです。上記の計算に従って2進数に直してみると、いつまで2倍しても小数部が0になりません。「0.000110011001100……」となり、以降「1100」を繰り返します。無限に続くのです。

ところが、コンピューターは無限に桁が続く数字は扱えません。扱える桁には上限があるため、どこかで打ち切って残りを切り捨てないとなりません。これが誤差になります。0.1+0.1+0.1は、0.1を3回足し合わせているようで、実は内部では0.1とはちょっと違う数の足し算をしているというわけです。

この誤差が計算結果に影響することもあれば、影響しないこともあります。これが0.1+0.1は0.2になるけれども、0.1+0.1+0.1が0.3にならない現象につながっているのです。

表計算ソフトやアプリでは弱点は解消済み

「じゃあ、安心してコンピューターに計算をまかせられないじゃないか」と不安を感じた人もいるでしょう。でも大丈夫。このようにコンピューターの苦手な所とその原理は明らかなので、その弱点をカバーするようにアプリを作ることができます。パソコンやスマートフォンに付属の電卓アプリや、Excelなどの表計算ソフトで0.1の足し算をやってみてください。もちろん、ちゃんと計算できるはずです。

『文系プログラマーのためのPythonで学び直す高校数学』では、もっと詳しく2進数と10進数の関係や、16進数のことも解説しています。このほかにも、これからのコンピューターに役立つ数学をやさしく解説しています。高校数学を復習しながら、ついでにコンピューターが計算する仕組みを知るにはぴったりです(Pythonでのプログラミングの入門もできちゃいます)。ぜひ一度手に取ってみてみてください。

(日経BP コンシューマーメディア局 仙石誠)

文系プログラマーのためのPythonで学び直す高校数学

著者 : 谷尻かおり(メディックエンジニアリング)
出版 : 日経BP
価格 : 2,700円 (税込み)

注目記事
今こそ始める学び特集