aduce ops

浮動小数点変換

IEEE 754 単精度・倍精度の内部表現(符号・指数・仮数)を bit 可視化。 10進値↔16進ダンプ双方向変換、0.1+0.2 誤差デモ付き。

精度
入力
ビット可視化
NORMAL(正規化数)
00111101110011001100110011001101
符号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 bit64 bit
符号1 bit1 bit
指数8 bit11 bit
仮数23 bit52 bit
バイアス1271023
有効桁(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 / 0Infinity - Infinity 等で発生。NaN === NaNfalse になる仕様で有名です。

なぜ 0.1 + 0.2 ≠ 0.3 か

2 進浮動小数点では 0.10.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 チェックで早期に弾く

使い方

  1. 精度(単精度 / 倍精度)を選択
  2. 10 進数値 or 16 進ダンプを入力
  3. ビット可視化と詳細表で内部表現を確認
  4. 「0.1 + 0.2」等のデモボタンで誤差を体感

関連ツール

プライバシー

計算はすべてブラウザ内で行われ、入力した値は弊社サーバには送信されません。