てもとツール

浮動小数点数ビューア|0.1が実際にどの値で保存されるかをIEEE 754で確かめる

10進の数が倍精度(binary64)・単精度(binary32)で実際に保存される値を、正確な10進・ビット・16進・隣の値で表示。0.1 + 0.2 のような計算で誤差が入った段も分けて出します。

ブラウザ内処理 公開
調べ方
精度

0.1・-2.5・6.02e23・1,234.5 の形と、NaN・Infinity を読みます。全角の数字も読みます。

手元で処理しました

ちょうどは表せないので、最も近い値に丸めました。

入力との差(保存値 − 入力): +5.55112e-18

正確な差: 0.0000000000000000055511151231257827021181583404541015625

保存される値(正確な10進)

0.1000000000000000055511151231257827021181583404541015625

最短の表記(読み戻すと同じ値になる、いちばん短い10進)

0.1

種類

正規化数

16進(ビットの並び)

3FB999999999999A

隣の値との間隔(ULP)

2^-56≈ 1.3877787807814457e-17

符号(1ビット)

0

指数(11ビット)

01111111011

仮数(52ビット)

1001100110011001100110011001100110011001100110011010

指数の欄 1019 − バイアス 1023 = -4

2進の形: 1.1001100110011001100110011001100110011001100110011010 × 2^-4

仮数を10進にすると: 1.600000000000000088817841970012523233890533447265625 × 2^-4

1つ小さい値
0.09999999999999999
この値
0.1
1つ大きい値
0.10000000000000002

丸めは IEEE 754 の既定(最も近い値へ。ちょうど中間なら仮数の末尾が偶数の側へ=最近接偶数)だけを扱います。単精度の計算は、途中を広い精度で計算する環境や、非正規化数を 0 にする設定では結果が変わることがあります。

このツールについて

使い方・特徴・補足情報

浮動小数点数ビューアとは

浮動小数点数ビューアは、10進で書いた数がコンピュータの中でどの値になるかを見せるツールです。 入力した数はブラウザ内だけで処理し、外部サーバーには送信しません。

JavaScript の number は、IEEE 754 の2進の形式(倍精度)で値を持ちます。 この形式では 0.1 をちょうど持てず、0.1000000000000000055511151231257827… が保存されます。

保存される値を正確な10進で出し、ビット・16進・隣の値と並べます。 2つの数の計算では、誤差が読み込みと計算のどちらで入ったかを段ごとに分けて出します。

こんな人におすすめ

小数の計算結果に戸惑う開発者や学生

楽になること

保存された値とビットの確認

避けたい手間

誤差の原因を推測で決めつけること

解決できる困りごと

  • 0.1 + 0.2 が 0.30000000000000004 になったとき、どの段で誤差が入ったかを推測せずに確かめられる
  • 画面に出る 0.1 と、実際に保存されている値の違いを、正確な10進の桁で見比べられる
  • 単精度にすると何桁目から値が変わるかを、同じ数を切り替えて確かめる手間が減る
  • メモリやファイルから取り出した16進の並びが、どんな数を表しているかを手計算せずに読める
  • 大きな整数が1つ飛びにしか表せない境目を、隣の値と間隔で具体的に確かめられる

使い方

  1. 「数を見る」の欄に数を入れます。開いたときは 0.1 が入っています。
  2. 倍精度と単精度を切り替え、保存される値と最短の表記を見比べます。
  3. ビットの帯で、符号・指数・仮数の3つの欄と16進の並びを確かめます。
  4. 「2つの数を計算」で数と演算を入れ、誤差が入った段を表で確かめます。
  5. ダンプした16進を読むときは「ビット列から」に貼り、必要ならバイト順を逆にします。

使用例

0.1を倍精度で読み込む

0.1 がちょうどは保存されない例です。保存される値と、画面に出る最短の表記が別のものである点に注目します。

入力

0.1(倍精度)

出力

保存される値: 0.1000000000000000055511151231257827021181583404541015625/最短の表記: 0.1/16進: 3FB999999999999A/入力との差: +5.55112e-18

0.1 + 0.2 の誤差の入り方

読み込みの誤差2回と、計算の丸め1回が重なる例です。結果が 0.3 と書いた値より1つ大きい値になる点に注目します。

入力

0.1 + 0.2(倍精度)

出力

結果: 0.30000000000000004(0.3 に最も近い値より 1 ULP 大きい)/0.1 + 0.2 === 0.3 は false

2の53乗を超える整数

整数でも、大きくなると隣の値との間が1より広がる例です。末尾の1が消える点に注目します。

入力

9007199254740993(倍精度)

出力

保存される値: 9007199254740992/隣の値との間隔: 2(この大きさでは整数が2おきにしか表せません)

単精度にすると桁が減る

同じ 123456789 でも、単精度では仮数が24ビットしかない例です。最短の表記と保存される値が違う整数になる点に注目します。

入力

123456789(単精度)

出力

保存される値: 123456792/最短の表記: 123456790/隣の値との間隔: 8

活用シーン

計算結果のテストが落ちたとき

期待値 0.3 と比べたテストが落ちたら、2つの数を入れて段ごとの誤差を見ます。比べ方を変えるべきかが分かります。

授業で浮動小数点数を学ぶ

符号・指数・仮数の欄を色で分けて見せます。手で2進に直した答えを、ビットの並びで答え合わせします。

バイナリのダンプを読む

ファイルやメモリから取り出した8バイトを貼り、どんな数かを読みます。リトルエンディアンの並びも逆にして読めます。

単精度で足りるかを見積もる

座標やセンサーの値を単精度で持つ前に、代表的な値を入れて隣の値との間隔を見ます。必要な細かさと比べます。

大きなIDを数として扱う前に

16桁を超えるIDを数として読むと、末尾が変わることがあります。値を入れて、保存される値が元の数と同じかを確かめます。

技術的な解説

補足: 仕組み

倍精度は符号1ビット・指数11ビット・仮数52ビット、単精度は1・8・23ビットです。 値は「(−1)^符号 × 1.仮数 × 2^(指数 − バイアス)」で、バイアスは1023と127です。

入力は BigInt の分数として正確に持ち、最も近い値へ1回だけ丸めます。 ちょうど中間なら仮数の末尾が偶数の側を選ぶ、IEEE 754 の既定の丸め方です。

最短の表記は ECMAScript の Number::toString と同じ選び方です。 短い順に候補を作り、読み戻して同じビットになるものを採ります。

もっと詳しく

保存される値と最短の表記は別のもの

0.1 と表示されても、保存されているのは 0.1000000000000000055511151231257827… です。 表示の 0.1 は「読み戻すと同じ値になる、いちばん短い10進」にすぎません。

単精度の 123456789 は 123456792 で保存され、最短の表記は 123456790 になります。 表示の数を元の値として扱うと、ずれの大きさを読み違えます。

0.1 + 0.2 の誤差は3つの段で入る

0.1 を読み込む段で +5.55e-18、0.2 を読み込む段で +1.11e-17 のずれが入ります。 2つを正確に足した値を倍精度へ丸める段で、さらに +2.78e-17 ずれます。

0.3 と書いた値は、0.3 より 1.11e-17 だけ小さい値として保存されます。 そのため結果は、0.3 と書いた値より1つ大きい隣の値になります。

単精度への変換は倍精度を経由すると1つずれることがある

10進を倍精度に丸め、それを単精度に丸め直すと、2回の丸めで答えが変わる入力があります。 単精度の2つの値のちょうど中間より、わずかに大きい数がその例です。

倍精度にした時点で中間ちょうどに寄り、次の丸めで偶数の側へ落ちます。 このツールは10進から単精度へ1回で丸めるので、この食い違いが起きません。

よくある質問

どの言語でも同じ結果になりますか?

JavaScript の number は仕様で倍精度と決まっていて、このツールの倍精度と同じ値になります。 Python の float も、ほぼすべての環境で同じ倍精度です。

C の float の計算は、途中を広い精度で行う環境では結果が変わることがあります。

誤差を出さずに小数を計算する方法はありますか?

2進の浮動小数点数を使う限り、0.1 のような数の誤差は消えません。 10進のまま計算する型(Python の decimal など)や、整数に直して計算する方法を使います。

比べるだけなら、差が許容誤差より小さいかで判定します。

丸め方を切り捨てや切り上げに変えられますか?

変えられません。扱うのは IEEE 754 の既定の丸め方(最も近い値・中間は偶数)だけです。

0方向や正の無限大方向への丸めは、このツールの対象外です。

半精度(16ビット)やbfloat16も見られますか?

見られません。倍精度(64ビット)と単精度(32ビット)の2つだけを扱います。

半精度の計算は、使う機器やライブラリで扱いが変わるため対象にしていません。

参考・出典

本ツールの計算式・判定基準は上記の公的機関・公式情報源を参考にしています。最新の情報は各リンク先をご確認ください。

関連記事

このツールの使い方や活用例をブログでも紹介しています。

関連ツール

同じカテゴリの他のツールも合わせてどうぞ。