浮動小数点数とは?IEEE 754の仕組みと誤差・型の選び方を実装目線で解説
浮動小数点数とは、符号・指数・仮数の3つの部分に分けて実数を近似的に表す数値表現です。小数点の位置を指数で動かせるため、極端に大きい値から極端に小さい値までを固定長のビットで扱えます。ただし桁数が有限である以上、10進の0.1のような値は正確に表せず、演算のたびに誤差が生じる。本記事では、浮動小数点数の定義と固定小数点との違い、IEEE 754における単精度float32・倍精度float64の内部ビット表現、0.1+0.2が0.3にならない丸め誤差の仕組み、桁落ちや情報落ちへの対処、そして金額や機械学習での型の選び方までを、実装で判断できる粒度で整理します。
目次
まとめ:浮動小数点数は実数の近似表現で誤差の理解が実装の前提
浮動小数点数は「±(仮数)×2の(指数)乗」という形で実数を表し、IEEE 754という国際規格がビット配分と丸めの規則を定めています。単精度は32ビットで有効桁が10進約7桁、倍精度は64ビットで約15〜16桁という近似精度を持つ。この有限桁ゆえに、0.1や0.2のような一部の10進小数は2進で正確に表せず、加減乗除のたびにわずかな誤差が積み重なります。
先に実装上の結論を置きます。科学計算・グラフィックス・機械学習のように広い範囲の実数を扱う処理は浮動小数点が向き、原則として倍精度float64を既定に選ぶ。一方で金額や在庫数のように1円・1個のズレも許されない値は、浮動小数点ではなく10進小数(DECIMAL)や最小単位の整数で持つのが安全です。以降の章で、IEEE 754の内部表現、誤差が生じる仕組み、そして型と演算順序の選び方を順に示します。
浮動小数点数の定義と固定小数点数との違いを実装目線で整理する
まず言葉の意味と、対になる固定小数点数との違いを押さえます。この2つは小数点の扱い方が根本から異なり、選び方が処理の性質を左右する。
浮動小数点数とは符号部・指数部・仮数部で実数を近似する数値表現
浮動小数点数は、1つの実数を符号部・指数部・仮数部の3要素に分解して格納します。仮数部が有効数字にあたる数値の並びを、指数部が小数点の位置(桁の大きさ)を担う。たとえば 6.022×10^23 のように、仮数(6.022)と指数(23)で表す科学的記数法を、コンピュータ内部で2進数に置き換えたものだと捉えると分かりやすくなります。小数点が指数によって「浮動」するため、同じビット数でも巨大な値と微小な値の双方を表現できます。
固定小数点数との違いと数値表現としての用途に応じた使い分け方
固定小数点数は、小数点の位置をあらかじめ固定して整数として扱う方式です。たとえば金額を「銭」単位の整数で持てば、小数点以下2桁を固定した固定小数点として計算できる。表現できる範囲は狭い代わりに、範囲内では10進の値を誤差なく正確に保持します。対して浮動小数点数は範囲が広く柔軟な一方、値そのものが近似のため誤差を伴う。両者の性質を一覧で比べます。
| 観点 | 浮動小数点数 | 固定小数点数(整数・DECIMAL) |
|---|---|---|
| 表現できる範囲 | 極大〜極小まで広い | 桁数で決まり狭い |
| 10進小数の正確さ | 近似(誤差あり) | 範囲内なら正確 |
| 演算速度 | 専用回路で高速 | 整数演算で高速・実装依存 |
| 向く用途 | 科学計算・3D・機械学習 | 金額・会計・数量 |
選び分けの軸は一つです。誤差が許される広範囲の連続量なら浮動小数点、1単位のズレも許されない離散的な金額・数量なら固定小数点、と用途で決めます。
なぜ整数だけでなく浮動小数点数という数値表現が必要になるのか
整数だけでは、小数や桁の大きく異なる値を素直に扱えません。惑星間の距離と原子の直径を同じ変数で計算するような場面では、扱う値が数十桁にわたって変動する。浮動小数点数は指数部でスケールを吸収するため、こうした桁差の大きい実数どうしの演算を、限られたビット幅で成立させます。速度面でも、CPUやGPUには浮動小数点演算専用のユニットがあり、大量の実数計算を高速に処理できる仕組みが用意されています。
IEEE 754の内部表現と単精度float32・倍精度float64の仕組み
ほとんどの言語・CPUが従う浮動小数点の規格が IEEE 754(2019年改訂版を含む系)です。ビットの配分と丸めの規則を統一し、環境が違っても同じ結果を得られるようにしている。ここでは内部のビット構造を分解します。
単精度float32と倍精度float64のビット配分と有効桁
IEEE 754の代表的な形式は、32ビットの単精度(float・binary32)と64ビットの倍精度(double・binary64)です。ビットは符号部・指数部・仮数部に分けられ、それぞれの幅が精度と範囲を決める。配分は次のとおりです。
| 形式 | 符号部 | 指数部 | 仮数部 | 10進の有効桁(目安) |
|---|---|---|---|---|
| 単精度 float32 | 1ビット | 8ビット | 23ビット | 約7桁 |
| 倍精度 float64 | 1ビット | 11ビット | 52ビット | 約15〜16桁 |
仮数部23ビットの単精度では、有効数字がおよそ7桁までしか保てません。8桁目以降を必要とする計算では、倍精度float64を選ぶことで約15〜16桁まで精度を伸ばせる。多くの言語で小数リテラルの既定が倍精度なのは、この余裕を確保するためです。
正規化数とケチ表現・指数バイアスと格納値から値を求める計算手順
IEEE 754は仮数を「1.××××」の形に正規化し、必ず先頭にくる整数部の1を省いて格納します。この省略はケチ表現(暗黙の1)と呼ばれ、単精度なら23ビットで実質24ビット分の精度を稼ぐ工夫です。指数部は負の指数も表せるよう、実際の指数に一定値を足したバイアス付きで格納する。単精度のバイアスは127、倍精度は1023で、格納値からこのバイアスを引いたものが本来の指数になります。値は「符号 × 1.仮数 × 2の(指数−バイアス)乗」で復元できます。
非正規化数と無限大・NaN・符号付きゼロという特殊な値の扱い
指数部がとりうる両端のビットパターンは、特殊な意味に予約されています。指数部が全ビット0のときは非正規化数(サブノーマル)として、先頭を1でなく0とみなし、0のごく近くの微小な値を表す。指数部が全ビット1のときは、仮数部が0なら無限大(±Inf)、仮数部が0以外なら非数(NaN)を表します。0を0で割った結果や、負数の平方根のような未定義の演算はNaNになり、NaNはそれ自身とも等しくならない性質を持つ。ゼロにも符号があり、+0と−0が区別される点も実装で見落としやすい部分です。
浮動小数点数で誤差が生じる仕組みと典型的な失敗パターンを整理
浮動小数点の近似性は、日々のコードでバグとして表面化します。なぜ誤差が出るのか、どの演算で膨らむのかを具体的に押さえます。
0.1+0.2が0.3にならない理由と2進数での循環小数の発生
10進の0.1は、2進数に直すと循環小数(0.0001100110011…)になり、有限桁では表し切れません。格納の時点で最も近い表現可能な値に丸められ、0.1も0.2もわずかにずれた値として保持される。その2つを足すと誤差が重なり、多くの環境で 0.1 + 0.2 は0.3ちょうどではなく 0.30000000000000004 のような値になります。これは特定の言語のバグではなく、IEEE 754に従うすべての環境で共通に起きる、2進浮動小数点の本質的な挙動です。
丸め誤差・桁落ち・情報落ち・打ち切り誤差という代表的な誤差の種類
誤差は生じる原因ごとに種類が分かれ、対処法も変わります。実装で遭遇する主なものを挙げます。
- 丸め誤差:表せない値を最も近い表現可能な値に丸める際に生じる、最も基本的な誤差です。
- 桁落ち:ほぼ等しい2つの数を引き算したとき、上位桁が打ち消し合って有効桁数が急減する現象。数値計算で結果が大きく崩れる原因になります。
- 情報落ち:絶対値の大きい数と小さい数を足したとき、小さい数の下位桁が丸めで消える現象。多数の値を合計する処理で無視できない差になります。
- 打ち切り誤差:無限級数や反復計算を有限回で止めることで生じる、アルゴリズム側の誤差です。
たとえば大量の小さな値を合計する処理では、大きくなった総和に小さな値を足し続けると情報落ちが積み上がる。合計を精度良く求めたい場合は、値を大きさ順に並べて小さいものから足す、あるいは補正項を用いる総和アルゴリズムを使う、といった演算順序の工夫で誤差を抑えられます。機械学習で誤差が層をまたいで積み上がる場面については、誤差逆伝播法で勾配を求める仕組みを扱った記事もあわせて参照してください。
浮動小数点数どうしの比較で等値演算子を使ってはいけない理由と対策
丸め誤差があるため、計算結果どうしを == で厳密に比較すると、数学的には等しいはずの値が「等しくない」と判定されることがあります。実装では、2つの値の差の絶対値が十分小さいか(|a − b| < ε)で判定する許容誤差つきの比較にする。εの取り方は扱う値のスケールに応じて、絶対誤差と相対誤差を組み合わせて決めます。ループの終了条件や一致判定を等値比較で書くと、環境やコンパイラの条件で結果が変わる不安定なコードになりがちです。
実装で浮動小数点数を採用する条件と型・データ設計を選ぶ判断基準
ここは判断の章です。浮動小数点を採用してよい場面と避けるべき場面を、条件付きで言い切ります。
浮動小数点数を採用してよい条件と倍精度float64を既定にする理由
次の条件にあてはまる処理は、浮動小数点が向きます。扱う量が連続的で範囲が広く、1単位未満のわずかな誤差が結果の妥当性を損なわない場合です。物理シミュレーション・3Dグラフィックス・統計・機械学習の学習計算がこれにあたる。型は原則として倍精度float64を既定に置き、有効桁の余裕で誤差の蓄積に耐えさせます。単精度float32を選ぶのは、メモリ量や演算量が支配的で、7桁程度の精度で足りると確認できたときに限る。速度やメモリのために精度を落とす判断は、必要な有効桁を見積もってから下します。
金額や数量は浮動小数点を避けDECIMALや整数で正確に持つ
金額・会計・在庫数のように、1円・1個のズレも許されない値には浮動小数点を使いません。0.1を正確に表せない以上、税計算や合計で1円の差異が発生し、帳簿が合わなくなるためです。対処は2通りある。1つは金額を「銭」や「最小通貨単位」の整数で保持し、表示時にのみ小数へ戻す方法。もう1つは、データベースの10進固定小数点型(DECIMAL/NUMERIC)で桁を明示して持つ方法です。テーブル設計として数値型を選ぶ際の考え方は、データベースの種類と型選びを扱った記事の観点と合わせて決めると、アプリ側とストレージ側の丸め方針を一致させられます。
機械学習の低精度float(FP16・bfloat16・量子化)を選ぶ判断
機械学習では、あえて精度を落とした浮動小数点や整数で計算量とメモリを削る設計が広がっています。半精度FP16は16ビットで学習・推論を高速化する一方、表せる範囲が狭く勾配が消えたり発散したりしやすい。bfloat16は指数部を単精度と同じ8ビットに保ち、範囲を確保しつつ仮数を削った形式で、学習の安定と速度を両立させます。さらに推論時にはINT8などへ量子化して軽量化する手法もある。どの精度まで落として品質を保てるかは、モデルとタスクごとに実測して決める判断です。低精度化の具体的な手法と採用可否は、LLM量子化の仕組みと採用判断を扱った記事で確認できます。こうした数値精度の設計を含むシステムやAIの構築を外部と分担したい場合は、数値計算やモデル実装を含む生成AI開発・AI受託開発のような形で、精度要件の定義から実装まで委ねる選択肢もあります。
浮動小数点数と誤差・精度・型の選び方に関するよくある質問と回答
実装の現場で挙がりやすい疑問を、5つに絞って答えます。
浮動小数点数と固定小数点数はどう違いますか?
浮動小数点数は指数で小数点の位置を動かし、広い範囲の実数を近似的に表す方式です。固定小数点数は小数点の位置を固定し、範囲内の値を整数として誤差なく保持します。桁差の大きい連続量には浮動小数点、金額や数量のように正確さが要る値には固定小数点(整数・DECIMAL)が向きます。
単精度float32と倍精度float64はどちらを使うべきですか?
特別な制約がなければ倍精度float64を既定にします。有効桁が10進約15〜16桁あり、誤差の蓄積に耐えやすいためです。単精度float32(約7桁)を選ぶのは、メモリ量や演算量が支配的で、7桁の精度で足りると確認できた場合に限ります。
なぜ0.1+0.2が0.3にならないのですか?
10進の0.1と0.2は2進数では循環小数になり、有限桁では正確に表せないためです。格納時に最も近い表現可能な値へ丸められ、その誤差が加算で重なることで、0.3ちょうどではなく0.30000000000000004のような値になります。IEEE 754に従うすべての環境で共通に起きる挙動です。
金額の計算に浮動小数点数を使ってはいけないのですか?
使わないほうが安全です。0.1を正確に表せないため、税計算や合計で1円単位の差異が生じ、帳簿が合わなくなります。金額は「銭」など最小単位の整数で持つか、データベースのDECIMAL/NUMERIC型で桁を明示して保持し、表示時にのみ小数へ戻すのが定石です。
浮動小数点数どうしを比較するときの注意点は何ですか?
丸め誤差があるため、== による厳密な等値比較は避けます。2つの値の差の絶対値が十分小さいか(許容誤差ε未満か)で判定し、εは扱う値のスケールに合わせて絶対誤差と相対誤差を組み合わせて決めます。ループの終了条件を等値比較で書かないことも要点です。
関連記事
- LLM量子化とは?仕組みとGPTQ・AWQ・GGUFの違い・企業の採用判断を解説【2026年版】:浮動小数点の精度を落として軽量化する具体手法と採用判断を扱っています。
- 誤差逆伝播法とは?連鎖律で勾配を求める仕組みと自動微分の実装判断を解説:数値誤差が層をまたいで積み上がる勾配計算の仕組みを確認できます。
- ニューラルネットワークとは?仕組み・種類・学習方法を実装目線で解説:低精度floatで学習・推論する土台となるモデルの基礎を押さえられます。
- データベースとは?種類・DBMS・RDBとNoSQLの選び方を実装目線で解説:金額をDECIMAL/整数で持つ数値型設計の前提を確認できます。
- MySQLとは?特徴とバージョン選定・採用判断を実装目線で解説【2026年版】:FLOAT/DOUBLE/DECIMALなど具体的な数値型の選択を検討できます。