浮動小数点数が実際に保持する値を見る
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・多倍長は扱いません。正確な十進計算には銭単位の整数か十進ライブラリを。この道具は理由を説明するもので、回避策ではありません。