IEEE 754 浮動小数点コンバーター
10進数の浮動小数点数を IEEE 754 の2進・16進表現へオンラインで変換。半精度(FP16)・単精度(FP32)・倍精度(FP64)・bfloat16 に対応し、実際に格納される値、丸め誤差、ビット配置を確認できます。すべての処理はブラウザ内で完結します。
| 符号 | |
| 指数部 | |
| 仮数部 |
- 入力値
- 実際の格納値
- 丸め誤差
- 前の値
- 次の値
- ULP(間隔)
| フォーマット | 総ビット数 | 符号 | 指数部 | 仮数部 | バイアス | 最大の有限値 | 10進桁数 |
|---|---|---|---|---|---|---|---|
| binary16 (FP16) | 16 | 1 | 5 | 10 | 15 | 65504 | ~3.3 |
| bfloat16 | 16 | 1 | 8 | 7 | 127 | ≈3.39×10³⁸ | ~2.3 |
| binary32 (FP32) | 32 | 1 | 8 | 23 | 127 | ≈3.40×10³⁸ | ~7.2 |
| binary64 (FP64) | 64 | 1 | 11 | 52 | 1023 | ≈1.80×10³⁰⁸ | ~15.9 |
IEEE 754 浮動小数点とは?
IEEE 754 は、コンピュータが実数を2進数でどのように格納するかを定めた標準です。すべての値は 3 つのフィールドに詰め込まれます。符号ビット、指数部(大きな値も微小な値も表せるようバイアス付きで格納)、そして有効数字を保持する仮数部です。ほぼすべての CPU、GPU、プログラミング言語がこの標準を採用しているため、JavaScript でも Python でも C でも SQL でも、まったく同じ丸めの不思議が現れます。
鍵となる洞察は、2進浮動小数点が m × 2ⁿ の形の数しか表現できないという点です。0.1 のような10進小数は2進数では無限循環小数 — 0.000110011001100… — になるため、フォーマットは最も近い表現可能な隣の値を代わりに格納します。単精度ではその値は 0.100000001490116119384765625、倍精度では 0.1000000000000000055511151231257827021181583404541015625 です。どちらも 0.1 ではありません。0.1 + 0.2 ≠ 0.3、じわじわとずれる合計値、失敗する等値比較 — 下流で起きるすべての奇妙な現象はこの一つの事実から導かれます。このコンバーターは、丸め直した近似値ではなく正確な格納値を表示することで、それを目に見えるようにします。
この標準は特殊値のためのビットパターンも予約しています。指数部がすべて 1 の場合は ±Infinity(仮数部が 0)または NaN(仮数部が非 0)を、指数部がすべて 0 の場合は符号付きゼロ(仮数部が 0)または非正規化数(仮数部が非 0)を表します。非正規化数は、精度を下げる代わりにゼロ付近のアンダーフローの隙間を埋めます。本ツールが扱う 4 つのフォーマット — binary16/FP16、bfloat16、binary32/FP32、binary64/FP64 — の違いは各フィールドに割り当てるビット数だけです。指数部のビットが多いほどレンジが広がり、仮数部のビットが多いほど精度が上がります。機械学習で人気の bfloat16 は、FP32 の仮数部の下位 16 ビットを切り落としただけのものです。レンジは同じで、精度は大幅に粗くなります。
有用なメンタルモデルは、表現可能な浮動小数点数が数直線上のグリッドを成しており、その間隔 — 最下位桁の 1 単位、すなわち ULP — が 2 の累乗ごとに倍になっている、というものです。1.0 の近くでは double のグリッド間隔は約 2.22 × 10⁻¹⁶ ですが、2⁵³ の近くでは丸ごと整数 1 個ぶんになります。double が 2⁵³ を超える整数を確実に数えられないのはこのためです。本ツールの近傍パネルはそのグリッドを直接表示します。入力した値の前後にある表現可能な値と、その間の正確な間隔です。
// Float ↔ hex through the raw IEEE 754 bits (works in any browser / Node.js)
const buf = new DataView(new ArrayBuffer(8));
function floatToHex32(value) {
buf.setFloat32(0, value); // rounds to nearest even
return '0x' + buf.getUint32(0).toString(16).toUpperCase().padStart(8, '0');
}
function hexToFloat32(hex) {
buf.setUint32(0, parseInt(hex, 16));
return buf.getFloat32(0);
}
floatToHex32(0.1); // '0x3DCCCCCD'
floatToHex32(3.14159); // '0x40490FD0'
hexToFloat32('3DCCCCCD'); // 0.10000000149011612 主な機能
4 つのフォーマットを 1 つの画面で
半精度(FP16)、bfloat16、単精度(FP32)、倍精度(FP64)— ワンクリックで切り替わり、ページ全体が再計算されます。同じ数値が各フォーマットでどう格納されるかを数秒で比較できます。
クリックできるビットグリッド
すべてのビットがボタンです。符号を反転したり、指数部を動かしたり、仮数部のビットを 1 つ変えたりすると、10進・16進・2進の表示が即座に更新されます。エンコーディングの直感を養う最速の方法です。
近似ではない正確な格納値
本ツールは、格納されたビットの完全な10進展開を正確な多倍長整数演算で計算します。double の 0.1 なら 55 桁すべてです。入力値に対する符号付きの丸め誤差も正確に表示します。
近傍値と ULP
現在の数値の前後にある表現可能な値と、その間の正確な間隔(ULP)を確認できます。この間隔こそ、任意の大きさの値で実際にどれだけの精度があるかを決めるグリッド幅です。
特殊値もワンクリック
チップで ±0、±Infinity、NaN、最小の非正規化数、選択中フォーマットの最大有限値を読み込めます。分類バッジが現在のビットパターンの種類を示します。
共有可能なパーマリンク、アップロードなし
「リンクをコピー」はフォーマットと正確なビットパターンを URL にエンコードします。バグ報告、コードレビュー、教育に最適です。すべてブラウザ内で動作し、入力内容がページの外に出ることはありません。
IEEE 754 変換の例
単精度の 0.1 — 丸め誤差の古典的な例
0.1
0x3DCCCCCD — 実際には 0.100000001490116119384765625 として格納
10進数の 0.1 は2進数では有限桁で表現できないため、IEEE 754 は最も近い表現可能な値を代わりに格納します。単精度(FP32)ではそれが 0x3DCCCCCD で、正確には 0.100000001490116119384765625 — 約 1.49 × 10⁻⁹ だけ大きい値です。本ツールは、プログラミング言語が丸めて表示する「0.1」ではなく、実際に格納された値と誤差を一桁残らず正確に表示します。この一例だけで、0.1 + 0.2 が 0.3 に等しくならない理由をはじめ、浮動小数点の不思議な挙動の大半を説明できます。
浮動小数点数から16進へ: FP32 の 3.14159
3.14159
0x40490FD0
単精度(FP32)を選択して 3.14159 と入力すると、16進フィールドには 0x40490FD0 と表示されます。符号 0、バイアス付き指数 128(つまり 2¹)、仮数部 0x490FD0 です。実際に格納される値は 3.141590118408203125 で、入力値よりわずかに大きくなります。16進形式はネットワークダンプ、GPU バッファ、レジスタビュー、シリアライズされたバイナリファイルで目にする形式であり、変換は双方向に機能します。40490FD0 を16進フィールドに貼り付ければ元の値にデコードできます。
FP16 の最大値: 半精度の限界は 65504
65504
0x7BFF — FP16 で表現できる最大の有限値
半精度は指数部が 5 ビット、仮数部が 10 ビットしかないため、表現できる最大の有限値は 65504(0x7BFF)です。65520 以上の値を入力すると、結果は Infinity(0x7C00)に丸められます。これは機械学習モデルを FP16 に量子化する際の現実的な危険です。bfloat16 に切り替えると同じ 65520 が問題なく収まります。bfloat16 は仮数部のビット(精度)を犠牲にして FP32 と同じ 8 ビットの指数部(レンジ)を維持しているためです。このトレードオフこそ、ML の学習では bfloat16 が、コンパクトなストレージでは FP16 が好まれる理由です。
−0 と +0: ビットパターンは異なるが値は同じ
-0
0x80000000(FP32)、+0 は 0x00000000
IEEE 754 には符号付きゼロがあります。−0 は符号ビットのみが 1(FP32 では 0x80000000)で、+0 はすべてのビットが 0 です。あらゆる言語で両者は等しいと判定されますが、1/−0 は −Infinity、1/+0 は +Infinity になるため、違いは観測可能です。ツール上で符号ビットをクリックして両者を切り替えると、分類バッジは「ゼロ」のまま16進値だけが変わります。ビットレベルの等価性と数値としての等価性が別物であることを、ワンクリックで実感できます。
IEEE 754 浮動小数点数の変換方法
- 1
浮動小数点フォーマットを選択する
単精度(FP32)があらかじめ選択されています。JavaScript や Python スタイルの数値なら倍精度(FP64)に、機械学習やグラフィックスで使われる 16 ビットフォーマットなら半精度(FP16)や bfloat16 に切り替えてください。
- 2
10進数を入力する
0.1、-2.5e3、65504 など任意の値を入力するか、特殊値チップで ±0、±Infinity、NaN、最小の非正規化数、最大の有限値を読み込めます。変換は入力と同時に行われます。
- 3
色分けされたビット配置を読む
符号ビット・指数部・仮数部が異なる色でハイライトされ、フィールド内訳テーブルには生のビット、バイアスの計算、暗黙の先頭ビットが表示されます。
- 4
正確な格納値と誤差を確認する
精度パネルには、実際に格納される値が全桁・正確に計算されて表示され、入力値との丸め誤差、前後の表現可能な値、ULP の間隔も併せて確認できます。
- 5
ビットを反転、16進を貼り付け、結果をコピー
任意のビットをクリックして反転させたり、16進値(3DCCCCCD)や2進文字列を貼り付けて10進に戻したりできます。16進・2進・正確な値のコピーに加え、まったく同じビットパターンを再現できる共有リンクも取得できます。
よくある浮動小数点の間違い
格納値ではなく表示値を信用する
言語は浮動小数点数を、往復変換が成立する最短の文字列に丸めて表示します。そのため格納値が汚くても 0.1 はきれいに見えます。精度は print() の出力ではなく、正確な展開で判断してください。
print(0.1) # 0.1 — 正確に見えるが、実際は違う
0.1 の格納値 (FP64) = 0.1000000000000000055511151231257827021181583404541015625
浮動小数点数を厳密等価で比較する
0.1 + 0.2 はビットパターン 0x3FD3333333333334 に、リテラルの 0.3 は 0x3FD3333333333333 に着地します。1 ULP の差があるため、どちらも 0.3 に近い値として表示されるのに == は false になります。
if (0.1 + 0.2 === 0.3) { … } // 決して実行されない if (Math.abs(a - b) < 1e-9) { … } // データに応じた許容誤差 レンジを確認せずに FP16 へ量子化する
FP16 の最大有限値は 65504 です。それより大きい値は Infinity になり、いったん Infinity が計算に混入すると伝播します。キャストダウンする前に最大値を確認するか、FP32 のレンジを保つ bfloat16 を使ってください。
fp16(65520) → Infinity (0x7C00) — 無警告のオーバーフロー
bf16(65520) → 有限値 (bfloat16 は指数部 8 ビットを維持)
NaN を等価演算子でテストする
NaN は自分自身と等しくない唯一の値です。これは、失敗した計算が本物の数値になりすませないようにするための設計です。== ではなく言語の isNaN チェックを使い、NaN のビットパターンが何百万通りも存在することも覚えておいてください。
if (x === NaN) { … } // x が NaN でも常に false if (Number.isNaN(x)) { … } // 正しいテスト IEEE 754 コンバーターでできること
- シリアライズされたバイナリデータのデバッグ
- ネットワークキャプチャ、GPU バッファ、レジスタダンプ、ファイルフォーマットで見つけた16進値を貼り付けて、正確な10進値にデコードできます。逆方向に変換してテストフィクスチャを書くことも可能です。バイトオーダーに関する注意: 表示される16進はビッグエンディアンのビットパターンです。ダンプがリトルエンディアンの場合は、貼り付ける前にバイトオーダーを反転してください。
- ML の量子化を理解する
- 値が FP16 の上限 65504 を超えないかチェックし、FP16 と bfloat16 の精度損失を桁単位で比較し、勾配がアンダーフローする非正規化数の範囲を調べられます。
- 浮動小数点バグの説明
- 「等しいはず」の 2 つの数値がなぜ異なるのかと同僚に聞かれたら、両方のビットパターンと正確な格納値を示すパーマリンクを送りましょう。議論は自ずと決着します。長いダンプにはテキスト比較ツールとの併用が便利です。
- エンコーディングの学習と教育
- コンピュータアーキテクチャの授業も、学生が指数部のビットをクリックしてバイアス計算の更新を見られれば具体的になります。フィールド内訳テーブルは、教科書がフォーマットを図解する形式をそのまま再現しています。
- 組み込み・産業用レジスタのデコード
- Modbus、CAN、センサーのペイロードには、FP32 値が生の16進ワードとして格納されていることがよくあります。そのワードをここに貼り付ければ、使い捨てスクリプトを書かずに物理値を読み取れます。
IEEE 754 のフォーマットと特殊値
- 4 つの2進フォーマット早見表
- binary16(FP16): 符号 1 + 指数部 5 + 仮数部 10 ビット、バイアス 15、最大値 65504、10進で約 3.3 桁。bfloat16: 1 + 8 + 7、バイアス 127、最大値 ≈ 3.39 × 10³⁸、約 2.3 桁。binary32(FP32): 1 + 8 + 23、バイアス 127、最大値 ≈ 3.40 × 10³⁸、約 7.2 桁。binary64(FP64): 1 + 11 + 52、バイアス 1023、最大値 ≈ 1.80 × 10³⁰⁸、約 15.9 桁。パターンは明快です。指数部のビットはレンジを、仮数部のビットは精度を買い、bfloat16 は精度のすべてを FP32 のレンジと意図的に引き換えています。
- 値の組み立て方
- 正規化数は (−1)^符号 × 1.仮数部 × 2^(指数 − バイアス) としてデコードされます。先頭の 1 は暗黙的であり、格納されません。23 ビットの仮数部フィールドが 24 ビットの精度を提供するのはこのためです。格納される指数は真の指数にバイアス(FP32 では 127)を加えた値で、2⁰ は 01111111 として格納されます。本ツールのフィールド内訳テーブルは、現在の値についてこの計算の各ステップを表示します。
- 特殊値: 予約された指数部パターン
- 指数部がすべて 1 で仮数部が 0 なら ±Infinity、仮数部が非 0 なら NaN です(標準的な quiet NaN は仮数部の最上位ビットを立てます)。指数部がすべて 0 で仮数部が 0 なら ±0、仮数部が非 0 なら非正規化数で、0.仮数部 × 2^(1 − バイアス) としてデコードされます — 暗黙の先頭 1 はありません。これらの規則は 4 つのフォーマットすべてで同一なので、同じチップがどのフォーマットでも機能します。
- 丸め: 最近接偶数への丸め
- 値が 2 つの表現可能な数の間に落ちた場合、IEEE 754 のデフォルトモードは近い方に丸めます。ちょうど中間の場合は、仮数部の最後のビットが 0 になる方を選びます(偶数への丸め)。これにより系統的なずれが防がれます。本コンバーターは10進入力を対象フォーマットへ絞り込む際にまさにこの規則を適用し、誤差パネルには結果として生じる符号付きの差が正確に表示されます。
- ULP: 浮動小数点のグリッド間隔
- 表現可能な浮動小数点数は等間隔には並んでいません。隣接する値の間隔(最下位桁の 1 単位)は 2 の累乗ごとに倍になります。1.0 の近くでは double の ULP は 2⁻⁵² ≈ 2.22 × 10⁻¹⁶ ですが、2⁵³ の近くでは ULP が 1.0 に達し、整数が飛び始めます。近傍パネルは現在の ULP を正確に表示します。「この大きさで自分の数値はどれだけ正確か?」に対する誠実な答えです。
浮動小数点のベストプラクティス
- 浮動小数点数を == で比較しない
- 演算を経ると、数学的に等しい 2 つの式が 1 ULP だけ離れた値になることがあります。扱う値の大きさに応じた許容誤差と比較するか、ビットパターン間の ULP 数を数えてください。本ツールならそれを直接確認できます。
- 金額を2進浮動小数点に入れない
- 2 の累乗のグリッドに 0.10 が正確に載ることはないため、浮動小数点での通貨計算は目に見える誤差を蓄積します。整数のセント単位か10進型を使ってください。本ツールの正確な格納値パネルが、その理由の動かぬ証拠です。
- 16 ビットフォーマットは習慣ではなくレンジで選ぶ
- 損失値、勾配、物理シミュレーションのスパイクなど、値が 65504 を超えうるなら、FP16 は Infinity にオーバーフローしますが bfloat16 は平然と進み続けます。逆にすべてが狭い範囲に正規化されているなら、FP16 の多い仮数部ビットが目に見えて良い精度を与えます。
- 縮小変換時の二重丸めの罠に注意
- 10進 → double → half と変換すると、まれな中間ケースで 10進 → half の直接変換と 1 ULP ずれることがあります。本ツールは10進入力を対象フォーマットへ一段階で丸めるため、表示されるのは正真正銘の IEEE 754 の答えです。
- 2⁵³ を超える整数は壊れると想定する
- double は 2⁵³ までのすべての整数を正確に格納しますが、そこから先は飛び飛びになります。2⁵³ + 1 は表現できません。その規模の ID やカウンタを扱うなら 64 ビット整数か文字列を使い、疑わしい値はここでビットレベルで確認してください。
IEEE 754 コンバーター FAQ
なぜ 0.1 + 0.2 は 0.3 に等しくないのですか?
IEEE 754 とは何ですか?
FP16 と bfloat16 の違いは何ですか?
非正規化数(デノーマル数)とは何ですか?
float と double のどちらを使うべきですか?
浮動小数点数を手作業で16進に変換するには?
このコンバーターを使うとデータはアップロードされますか?
関連ツール
すべてのツールを見る →進数変換ツール — 2進数・16進数・10進数・8進数
単位変換
無料オンライン進数変換ツール。2進数、8進数、10進数、16進数および任意の基数(2-36)間で数値を瞬時に変換。BigInt対応で桁数制限なし。登録不要・サーバー送信なし、すべての処理がブラウザ内で完結。コピーボタンやコードリテラル出力で開発作業を効率化。
カラーコンバーター — HEX, RGB, HSL & OKLCH
単位変換
HEX を RGB、HSL、OKLCH、OKLAB、CMYK にブラウザで変換できます。任意の形式をワンクリックでコピー。無料・登録不要・色データはページから一切送信されません。
HEX から CMYK へのコンバーター
単位変換
HEX カラーを CMYK にブラウザで変換できます。印刷プレビュー向けの sRGB ベースの単純な近似値です。無料・登録不要、色データはローカルから出ません。
HEX から HSL へのコンバーター
単位変換
任意の HEX カラーを HSL にブラウザで変換できます。3 桁・6 桁・アルファ付き 8 桁の HEX すべてに対応。無料・即時・登録不要、色データはページから一切送信されません。
HEX から OKLCH へのコンバーター
単位変換
HEX を OKLCH に変換し、Tailwind v4 デザイントークンに対応します。知覚的に均一なライブ出力に加え、Display P3 色域の警告も表示。無料・ブラウザ完結。
HEX から RGB へのコンバーター
単位変換
任意の HEX カラーコードを RGB にブラウザで変換できます。3 桁・6 桁・アルファ付き 8 桁の HEX すべてに対応。無料・即時・登録不要、色データはページから一切送信されません。