aduce ops
浮動小数点変換
IEEE 754 単精度・倍精度の内部表現(符号・指数・仮数)を bit 可視化。 10進値↔16進ダンプ双方向変換、0.1+0.2 誤差デモ付き。
| 符号 | 0 (+) |
|---|---|
| 指数(バイアス前) | 123(0x7B) |
| 指数(バイアス後) | -4 |
| 仮数(フィールド値) | 5033165 (0x4CCCCD) |
| 仮数(暗黙の 1 含む) | 13421773 (0xCCCCCD) |
| 16 進ダンプ | 0x3DCCCCCD |
| 2 進表示 | 0 01111011 10011001100110011001101 |
| 値 | 0.10000000149011612 |
浮動小数点変換ツールとは
本ツールは、IEEE 754 形式の浮動小数点数(単精度 32bit / 倍精度 64bit) を入力・解析し、内部表現(符号 / 指数 / 仮数)をビット単位で可視化する無料オンラインツールです。10 進値 ↔ 16 進ダンプの双方向変換、 特殊値(NaN / 無限大 / 非正規化数 / ±0)の判定、 「0.1 + 0.2」誤差デモまで一画面で確認できます。
IEEE 754 とは
ほぼ全てのモダンな CPU・プログラミング言語が採用する浮動小数点数の標準規格。実数を有限ビットで近似する ためのルールを定めています。値は次の構造で表されます。
値 = (-1)^符号 × 1.仮数 × 2^(指数 - バイアス)単精度(32bit)と倍精度(64bit)
| 項目 | 単精度(float) | 倍精度(double) |
|---|---|---|
| 合計 | 32 bit | 64 bit |
| 符号 | 1 bit | 1 bit |
| 指数 | 8 bit | 11 bit |
| 仮数 | 23 bit | 52 bit |
| バイアス | 127 | 1023 |
| 有効桁(10 進) | 約 7 桁 | 約 15-17 桁 |
| 絶対値の範囲 | 約 1.4e-45 〜 3.4e38 | 約 5e-324 〜 1.8e308 |
JavaScript の number 型は常に倍精度。 Java の float / double、C/C++ の同名型、 Python の float(実体は double)など、言語ごとに 既定が異なります。
内部表現の構造
符号ビット(1 bit)
正なら 0、負なら 1。これにより+0 と -0 が区別されるのが浮動小数点の特徴です。
指数部
バイアス指数を採用。実際の指数はraw exponent - bias で求めます。バイアスにより 負の指数も非負ビット列で表現できます。
- 単精度 bias = 127 → raw=127 で実効指数 0
- 倍精度 bias = 1023 → raw=1023 で実効指数 0
仮数部(ケチ表現 / 暗黙の 1)
正規化数では先頭ビットは必ず 1 なので明示的に格納されません。 単精度 23bit の仮数フィールドは「実は 24bit の精度」を持ちます。
実際の仮数 = 1.<23bit のフィールド値>特殊値
±0(正のゼロ / 負のゼロ)
指数も仮数も全て 0。符号 bit のみ異なる。1 / -0 === -Infinity のように演算結果に符号が引き継がれる。
非正規化数(subnormal / denormal)
指数が全て 0、仮数が非ゼロ。暗黙の 1 を持たず、 最小値より小さい範囲を表現します(段階的アンダーフロー)。 計算が遅くなる CPU もあるため数値計算ライブラリでは flush-to-zero モードを使う場合があります。
±∞(無限大)
指数が全て 1、仮数が 0。オーバーフロー時や 1 / 0 で発生。
NaN(Not a Number)
指数が全て 1、仮数が非ゼロ。0 / 0、Infinity - Infinity 等で発生。NaN === NaNが false になる仕様で有名です。
なぜ 0.1 + 0.2 ≠ 0.3 か
2 進浮動小数点では 0.1 と 0.2 はどちらも循環小数になり、有限ビットに丸めて格納されます。 本ツールで 0.1 をデコードすると、仮数が11001100... のパターンになることが確認できます。
加算結果は 0.30000000000000004。これに対し0.3 自体も近似値で格納されており、両者の bit パターンは異なります。 本ツールの「0.1 + 0.2 デモ」ボタンで実際の差分を可視化できます。
各言語での扱い
- JavaScript:
number= 倍精度のみ。 単精度はMath.fround()で取得 - Python:
float= 倍精度。numpy.float32で単精度 - Java:
float(単精度) /double(倍精度) - Go:
float32/float64 - Rust:
f32/f64
「単精度」「倍精度」の選び方
単精度は容量・帯域・GPU 演算の効率を優先する場面(機械学習推論、 グラフィックス、組み込み)で選ばれます。一方、財務計算や科学計算、 位置情報など桁落ちが致命的な場面では倍精度が標準です。 近年は GPU 推論で fp16(半精度) やbf16(bfloat16) など、より少ないビット数の表現も普及しています。
0.1 の内部表現を覗く
0.1 を倍精度で格納すると、仮数フィールドは1001100110011001100110011001100110011001100110011010のような循環パターンになります(最後で丸めが入る)。 本ツールに 0.1 を入力すれば、この循環構造が一目で分かります。0.5(仮数部全 0)や 0.25 のような 2 のべき乗系の小数は丸め誤差なく格納できる点も対比できます。
典型的な落とし穴
- 等値比較: 浮動小数点同士の
==は危険。 許容誤差(イプシロン)を介して比較する - 金額計算: 金融計算では浮動小数点を避け、 整数(最小単位ベース)か decimal 型を使う
- 累積誤差: ループで足し続けると誤差が蓄積する。 Kahan summation 等の補正アルゴリズムがある
- NaN の伝播: NaN を含む演算は NaN を返す。 想定外の入力を NaN チェックで早期に弾く
使い方
- 精度(単精度 / 倍精度)を選択
- 10 進数値 or 16 進ダンプを入力
- ビット可視化と詳細表で内部表現を確認
- 「0.1 + 0.2」等のデモボタンで誤差を体感
関連ツール
プライバシー
計算はすべてブラウザ内で行われ、入力した値は弊社サーバには送信されません。