レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

BLOCKVROCKリファレンス目次はこちら

知ってるようでしらない浮動小数点数の演算誤差

IT教育という仕事をやってると曖昧な知識では許されない場合があって、
突っ込んでしらべものをする機会があります。
今回は浮動小数点数の演算誤差についてしらべました。

難しい部分を適度に省略して説明してみます。

問題

0.1を2進数に変換した後、10進数に戻すと0.1にはならないのはなぜか?

浮動小数点数とは

浮動小数点数では数値を「(仮数)×(基数)指数」で表現します。
つまり、すべて2のn乗と、2のマイナスn乗を使って表すことになります。

小数点以下は、2-n(2のマイナスn乗)で表します。
(例えば2の-2は0.5)

ここで、0.1を2n(2のn乗)で表そうとすると、以下のようになります。
1 * 2-4 = 0.0625 足す
1 * 2-5 = 0.03125 足す
1 * 2-8 = 0.00390625 足す
1 * 2-9 = 0.001953125

実はここまでの計算をしても0.099609375となり、0.1にはなりません。

ここで浮動小数点数の誤差が生じるのです。