10進数の0.1を2進数に変換すると誤差ができるのはなぜ?

10進数と2進数で誤差が出ることを説明するために、簡単な例を使ってみましょう。まず、10進数と2進数の基本的な違いから始めます

10進数(Decimal)

  • これは私たちが普段使っている数のシステムです。
  • 10進数は0から9までの数字を使います。

2進数(Binary)

  • コンピュータが使う数のシステムです。
  • 2進数は0と1のみを使います。

誤差が出る理由

  • 10進数できれいに表せる数が、2進数ではきれいに表せないことがあります。これが誤差の原因です

10進数の0.1を2進数に変換する方法

10進数の0.1を2進数に変換する方法を説明するには、小数点以下の2進数への変換プロセスを理解する必要があります。このプロセスは「2をかけて、整数部分を書き出す」操作を繰り返すことによって行います。しかし、重要な点として、0.1のような一部の10進数小数は2進数では完全には表現できず、近似値になることを覚えておく必要があります。

  1. 2をかける: 0.1に2をかけます。
  2. 整数部分を書き出す: 結果の整数部分を書き出し、残りを次のステップに持ち越します。
  3. 繰り返す: 残りに再度2をかけ、また整数部分を書き出します。これを繰り返します。

実際の計算:

  1. 0.1 × 2 = 0.2 → 整数部分は0、残りは0.2
  2. 0.2 × 2 = 0.4 → 整数部分は0、残りは0.4
  3. 0.4 × 2 = 0.8 → 整数部分は0、残りは0.8
  4. 0.8 × 2 = 1.6 → 整数部分は1、残りは0.6
  5. 0.6 × 2 = 1.2 → 整数部分は1、残りは0.2

このプロセスを続けていくと、整数部分の列は「0011」(0.1, 0.2, 0.4, 0.8から得られる)となり、これが繰り返されることになります。ですが、完全には終わらないので、2進数では0.1を「0.0001100110011…(無限に続く)」と表現することになります。

この変換プロセスは、理論的には無限に続きますが、実際のコンピュータシステムではある程度の桁数で打ち切られるため、2進数での表現は0.1の近似値となります。これが、10進数と2進数の間の小数点以下の数値で発生する誤差の原因の一つです。

参考

C#,学習

Posted by hidepon