浮動小数点数が実際に保持する値を見る

0.1 + 0.2が0.3にならない理由。符号・指数・仮数ビットを実際の値として確認します。

このガイドで使う道具

やりたいこと

0.1 + 0.2 ≠ 0.3や、JSONの数値が17桁で表示されるといった浮動小数点の不思議は、バイナリを見れば納得できます。doubleは入力した十進数ではなく近似値を保持しています。

値を調べる

十進数か64ビットの16進パターンを入力すると、符号ビット・バイアス指数・仮数に分解し、実際に保持する値・16進ワード・上下に隣接する表現可能な値を表示します。隣との隙間が、その桁数での精度です。

  • ±0・NaN・Infinity・デノーマル(正規化できないほど小さい数)は特別ケースとして表示します。
  • `0x3FF0000000000000`のような16進を入れれば、ビット→値の逆向きもできます。

具体例

0.1を入力すると、保持値は0.1000000000000000055511151231257827と表示されます。0.1に最も近いdoubleです。これにもう1つ0.1分の誤差が乗ると、有名な0.30000000000000004が現れます。

対応範囲

IEEE-754 binary64(JSの数値すべてが使うdouble)のみで、32ビットfloat・十進float・多倍長は扱いません。正確な十進計算には銭単位の整数か十進ライブラリを。この道具は理由を説明するもので、回避策ではありません。