浮動小数点数計算機 (IEEE 754)

0.1 + 0.2 が 0.3 にならない理由がここにある。ビットの裏側を可視化。

数値を入力 (10進数)

解析結果 (IEEE 754 Format)

執筆者:Kaori Suzuki (Gojikara ソフトウェアエンジニア)

プログラミングを学び始めて、最初にぶつかる「不可解な壁」の一つに、浮動小数点数の計算誤差があります。例えば、PythonやJavaScriptのコンソールで 0.1 + 0.2 と打ってみてください。期待する 0.3 ではなく、0.30000000000000004 という奇妙な数字が返ってきます。

この現象はバグではありません。コンピュータが有限のメモリ(ビット数)で無限に続く小数を表現しようとした結果生じる、仕様通りの「誤差」なのです。本記事では、世界中のコンピュータで標準採用されている IEEE 754 規格の仕組みと、ビットレベルでの表現方法について、1000文字以上のボリュームで徹底解説します。

1. コンピュータは2進数しか話せない

私たち人間は10進数(0-9)を使いますが、コンピュータはスイッチのON/OFF、すなわち2進数(0,1)しか扱えません。 整数(例: 5 = 101)の変換は簡単ですが、小数(例: 0.1)は2進数にすると 0.0001100110011... と無限に続く循環小数になります。これをメモリに格納するには、どこかで「打ち切る(丸める)」必要があります。これが誤差の正体です。

2. IEEE 754の構造

浮動小数点数は、数値を以下の3つのパーツに分解して保存します。

`Value = (-1)^{Sign} × (1 + Mantissa) × 2^{(Exponent - Bias)}`

① 符号部 (Sign Bit) - 1bit

正なら 0、負なら 1 が入ります。

② 指数部 (Exponent)

小数点の位置(桁の大きさ)を決めます。
単精度(32bit): 8bit。バイアス値は127。
倍精度(64bit): 11bit。バイアス値は1023。

③ 仮数部 (Mantissa / Fraction)

有効数字を表す部分です。「1.xxxx...」の「xxxx...」の部分だけを保存します(ケチ表現)。
単精度: 23bit
倍精度: 52bit

3. 単精度 (float) vs 倍精度 (double)

  • float (32bit): 有効桁数は10進数で約7桁。メモリ消費が少なく高速ですが、科学計算や金融計算には精度不足なことが多いです。ゲームの座標計算などでよく使われます。
  • double (64bit): 有効桁数は約15〜16桁。現代のPCでは標準的に使われています。JavaScriptの Number 型は、実はすべてこの64bit倍精度浮動小数点数です。

4. エンジニアが知っておくべきこと

「お金の計算にfloat/doubleを使ってはいけない」というのは鉄則です。0.1円の誤差が積み重なって大きなズレになるからです。金融システムでは、固定小数点数(Decimal型)や整数(値を100倍して円単位ではなく銭単位で管理するなど)を使用します。

この計算機を使って、0.1 がどのようにビット表現されるか、そしてfloatとdoubleでどう異なるかを確認してみてください。一見きれいな数字に見えても、内部では近似値として扱われている現実が見えてくるはずです。

Gojikaraは、Black Boxを開け、技術の本質を理解するエンジニアを応援します。