固定小数点と浮動小数点の違い:表現・範囲と精度・演算器の規模・オーバーフロー・用途を比較

固定小数点は、小数点の位置をあらかじめ決めておき、整数と同じビット列と演算器で小数を扱う方式です。回路が小さく電力も少ないので、DSPや浮動小数点の演算器を持たないマイコン、AIの推論の整数演算で使われます。浮動小数点は、符号・指数部・仮数で数を表し、指数部で小数点の位置を動かすので、非常に広い範囲の値を、ほぼ一定の相対精度で扱えます。演算器は大きくなりますが、桁合わせを気にせずに使えるので、汎用の計算やAIの学習の標準になっています。

項目固定小数点浮動小数点
表現のしかた整数のビット列に、決めておいたスケール(2の−n乗)を掛けて読む。Q15などと表す符号・指数部・仮数の3つで、(−1)^符号 × 1.仮数 × 2^(指数 − バイアス)と表す。IEEE 754で規定
表せる範囲(例)Q15(16ビット)では −1〜1 − 2⁻¹⁵単精度(32ビット)ではおよそ10⁻³⁸〜10³⁸。非正規化数でさらに0の近くまで
精度刻みが一定(絶対誤差が一定)。小さい値ほど相対誤差が大きい相対精度がほぼ一定(単精度で約7桁)。値が大きいほど刻みも大きい
演算器整数の加算器と乗算器そのまま指数の比較、仮数の桁合わせ、正規化、丸めの回路が必要
回路の規模と電力小さい。同じビット幅なら浮動小数点よりずっと少ない大きい。同じビット幅の整数の演算器より、面積もエネルギーも数倍以上になることが多い
オーバーフローの扱い2の補数では反対側の値に回り込む。飽和演算や、余裕のビット(ガードビット)を持つ累算器で防ぐ表せる最大値を超えると±無限大になる。0÷0などはNaN
スケーリングプログラマが値の範囲を見積もり、各演算でのシフトや桁の位置を設計する指数部が自動で調整するので、ほとんど意識しなくてよい
結果の再現性ビット単位で同じ結果になりやすい足し算の順序で結果がわずかに変わる(結合法則が成り立たない)
使われる場所DSP、浮動小数点の演算器のない小さなマイコン、FPGAやASICの信号処理、AIの推論の整数演算(INT8など)パソコンやサーバーの汎用計算、科学技術計算(倍精度)、グラフィックス、AIの学習(FP32・BF16・FP16・FP8)

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

固定小数点
値の範囲があらかじめ分かっている信号処理を、小さな回路や少ない電力で行いたいとき。音声や通信のフィルタ、モータ制御、FPGAでの実装、量子化したAIモデルの推論。
浮動小数点
値の範囲が広い、または前もって分からない計算。科学技術計算、物理シミュレーション、グラフィックス、AIの学習など、開発のしやすさと数値の安定性を優先したいとき。
組み合わせ
AIでは、学習を浮動小数点で行い、推論ではスケールを掛けた整数(INT8など)に量子化して、固定小数点と同じような整数の演算器で計算することが多くなっています。

よくある質問

固定小数点はなぜ回路が小さいのですか?

小数点の位置が決まっているので、整数の加算器や乗算器をそのまま使えるからです。浮動小数点では、足し算のたびに指数を比べて仮数の桁をそろえ、結果を正規化して丸める回路が必要になり、面積と電力が大きくなります。

固定小数点でオーバーフローが起きるとどうなりますか?

2の補数の整数と同じく、最大値を超えると最小値の側に回り込み、正の大きな値が負の値になるような大きな誤差になります。DSPでは、最大値や最小値にとどめる飽和演算や、ガードビットを持つ広い累算器でこれを防ぎます。

浮動小数点なら誤差はないのですか?

いいえ。浮動小数点も有限のビット数なので、0.1のように2進数で正確に表せない値には丸め誤差があり、桁落ちや情報落ちも起こります。表せる範囲が広く、相対精度がほぼ一定だというのが利点です。

AIの推論でINT8を使うのは固定小数点ですか?

考え方は近いです。浮動小数点の値をスケールで割ってINT8の整数にし、整数の積和演算をしてから、最後にスケールを掛けて戻します。固定小数点との違いは、スケールが2のべき乗に限らず、層やチャネルごとに決められることです。

理解度チェック

小さなマイコンやDSPで、浮動小数点ではなく固定小数点の演算がよく使われる主な理由はどれか。

  1. A整数の演算回路で計算でき、回路が小さく消費電力も少ないから
  2. B固定小数点の方が、浮動小数点より常に広い範囲を表せるから
  3. C固定小数点では、丸め誤差がまったく生じないから
答えと解説を見る

正解:A. 整数の演算回路で計算でき、回路が小さく消費電力も少ないから

固定小数点は、小数点の位置を決めておくだけで中身は整数なので、足し算や掛け算を整数の回路で行えます。浮動小数点の演算器のように指数をそろえたり正規化したりする回路が要らないため、チップの面積と消費電力を抑えられ、コストの低いマイコンや信号処理用のDSPで重宝されます。その代わり表せる範囲が狭く、桁あふれや精度の不足に注意して設計する必要があります。範囲は浮動小数点の方が広く、固定小数点でも丸め誤差は生じます。

16ビットの符号付き固定小数点のQ15形式(小数部15ビット)で表せる値の刻み(分解能)と範囲の組み合わせとして正しいものはどれか。

  1. A刻み 2⁻¹⁶、範囲 0〜1
  2. B刻み 2⁻¹⁵、範囲 −1〜1 − 2⁻¹⁵
  3. C刻み 2⁻¹⁵、範囲 −32768〜32767
答えと解説を見る

正解:B. 刻み 2⁻¹⁵、範囲 −1〜1 − 2⁻¹⁵

Q15は16ビットのうち1ビットが符号、15ビットが小数部で、整数として読んだ値を 2¹⁵ = 32768 で割った値を表します。整数の範囲 −32768〜32767 を32768で割ると、−1〜32767/32768 = 1 − 2⁻¹⁵ になり、刻みは 1/32768 = 2⁻¹⁵ ≈ 3.05 × 10⁻⁵ です。ちょうど+1は表せない点に注意が必要です。−32768〜32767は、小数点を考えずに整数として読んだときの範囲です。音声などの信号処理でよく使われる形式です。

小数部8ビットの固定小数点数どうしを、整数の掛け算器で掛けたときの結果の扱いとして正しいものはどれか。

  1. A結果もそのまま小数部8ビットの形式になるので、何もしなくてよい
  2. B結果の小数部は4ビットになるので、左に4ビットずらす
  3. C結果の小数部は16ビットになるので、元の形式に戻すには右に8ビットずらす
答えと解説を見る

正解:C. 結果の小数部は16ビットになるので、元の形式に戻すには右に8ビットずらす

小数部8ビットの数は、実際の値を 2⁸ 倍した整数として記録されています。2つを掛けると 2⁸ × 2⁸ = 2¹⁶ 倍された値になり、結果の小数部は16ビットになります。元の小数部8ビットの形式に戻すには、2⁸ で割る、つまり右に8ビットずらし、必要なら丸めます。掛け算の結果は桁数が増えるので、途中は広いビット幅で計算するのが普通です。足し算なら小数部のビット数は変わりませんが、掛け算では足し合わされます。

  1. IEEE 754の単精度(32ビット)の浮動小数点数で、符号・指数部・仮数に割り当てられるビット数の組み合わせはどれか。
  2. bfloat16がAIの学習で使われる主な理由はどれか。
  3. AIの推論で、重みをFP32からINT8に変換(量子化)する主な利点はどれか。

計算機算術の練習問題へ

関連する用語の解説

固定小数点
小数点の位置を決めておき、整数と同じビット列で小数を表す方式。整数の演算回路で計算でき、回路が小さく消費電力も低いが、表せる範囲は狭い。Q15のように小数部のビット数で表すこともある。
IEEE 754
浮動小数点数の表し方と演算の規則を定めた国際規格。単精度(32ビット)・倍精度(64ビット)などの形式、丸めの方法、無限大やNaNなどの特殊値を定め、計算結果がコンピュータによらずそろうようにしている。
飽和演算
計算結果が表せる範囲を超えたとき、桁あふれで反対側の値に回り込ませず、最大値または最小値にとどめる演算。音声や画像の信号処理で、大きな誤差を防ぐために使われる。
bfloat16
符号1ビット、指数8ビット、仮数7ビットの16ビットの浮動小数点の形式。指数がFP32と同じなので表せる範囲が広く、精度は低いがAIの学習で使われる。FP16は指数5ビット・仮数10ビットで、精度は高いが範囲が狭い。
INT8
8ビットの符号付き整数(−128〜127)。AIの推論で、重みや活性化の値をスケールを掛けてINT8に変換(量子化)すると、計算とメモリが大きく減り、整数の小さな回路で高速に処理できる。

関連する比較