原码、反码、补码,0.1 + 0.2≠0.3 的揭秘
2023-12-06 10:36:56
引言
计算机の世界は謎に満ちています。その中の一つが、原碼、反碼、補碼という概念です。さらに、数学における 0.1 + 0.2 ≠ 0.3 という謎が加わると、さらに複雑になります。この記事では、これらの概念をわかりやすく説明し、その背後にある理由を探ります。
原碼、反碼、補碼
原碼
ある数値の2進数表現を原碼と言います。最も左のビットは符号ビットで、0 は正、1 は負を表します。
反碼
反碼は、原碼の符号ビット以外のすべてのビットを反転させたものです。
補碼
補碼は、反碼の 1 の補数です。つまり、すべてのビットを反転し、最も右のビットに 1 を加えます。
補碼による減算
減算を計算するために、コンピュータは補碼を使用します。以下に手順を示します。
- 被減数と減数の補碼を計算します。
- 両者を 2 進数で加算します。
- 加算の結果の最上位ビットが符号ビットです (1 なら負)。
- 最上位ビットを除く結果は減算の結果です。
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 という謎は、この誤差の結果です。このような誤差を理解することで、コンピュータで浮動小数点演算を行う際の制限を認識することが重要です。