返回

原码、反码、补码,0.1 + 0.2≠0.3 的揭秘

前端

引言

计算机の世界は謎に満ちています。その中の一つが、原碼、反碼、補碼という概念です。さらに、数学における 0.1 + 0.2 ≠ 0.3 という謎が加わると、さらに複雑になります。この記事では、これらの概念をわかりやすく説明し、その背後にある理由を探ります。

原碼、反碼、補碼

原碼

ある数値の2進数表現を原碼と言います。最も左のビットは符号ビットで、0 は正、1 は負を表します。

反碼

反碼は、原碼の符号ビット以外のすべてのビットを反転させたものです。

補碼

補碼は、反碼の 1 の補数です。つまり、すべてのビットを反転し、最も右のビットに 1 を加えます。

補碼による減算

減算を計算するために、コンピュータは補碼を使用します。以下に手順を示します。

  1. 被減数と減数の補碼を計算します。
  2. 両者を 2 進数で加算します。
  3. 加算の結果の最上位ビットが符号ビットです (1 なら負)。
  4. 最上位ビットを除く結果は減算の結果です。

0.1 + 0.2 ≠ 0.3 の謎

コンピュータは数値を 2 進数で表すため、小数点以下の値は誤差が発生する可能性があります。0.1 と 0.2 を 2 進数に変換すると次のようになります。

0.1 = 0.0001100110011001100110011... (無限に続く)
0.2 = 0.001100110011001100110011... (無限に続く)

これらの数値を 2 進数で加算すると、次のようになります。

0.1 + 0.2 = 0.1001100110011001100110011... (無限に続く)

しかし、コンピュータは数値を有限のビット数で表現するため、小数点以下の値は丸められます。ほとんどのコンピュータでは、32 ビット浮動小数点形式が使用されており、これは有効数字が 24 ビットのみです。この場合、0.1 + 0.2 は次のように丸められます。

0.1001100110011001100110011... (無限に続く)
↓ 丸め
0.1001100110011001100110100 (24 ビット)

この丸めにより、0.3 ではなく 0.2999999523162842 となり、誤差が発生します。

結論

原碼、反碼、補碼は、コンピュータにおける減算を可能にする重要な概念です。しかし、コンピュータが数値を 2 進数で表現する方法により、小数点以下の値では誤差が発生する可能性があります。0.1 + 0.2 ≠ 0.3 という謎は、この誤差の結果です。このような誤差を理解することで、コンピュータで浮動小数点演算を行う際の制限を認識することが重要です。