1 固定小数点の基本

1.1 表現形式の概念

1.1.1 小数点位置の固定

固定小数点は、実数値を表す際の小数点位置をあらかじめ決めておき、その位置に対応する重みを一定とする表現である。典型的には「整数部は何ビット」「小数部は何ビット」という形で指定し、同じ設計では、あるビット列が常に同じスケールの値を意味する。これにより、計算機内部では整数演算として扱いながら、小数をもつ数として統一的に扱える。

1.1.2 整数としての符号化

固定小数点では、値は最終的にビット列として保持されるが、内部表現としては「整数」と同様に加減算や比較が行える。符号付きの場合、最上位ビットを符号に対応させるため、表現範囲が負側と正側に広がる。符号なしの場合は負の値を表せず、同じビット幅でも利用できる範囲が片側に偏る。実装では、スケール係数(小数部の重み)を掛けたり割ったりする代わりに、ビットシフトや整数演算で効率化する。

1.2 表せる数の特性

1.2.1 表現範囲

固定小数点の表せる範囲は、総ビット数と符号の有無、および小数部ビット数によって決まる。符号付きでは正負に広がるが、符号なしでは上限のみが制約となり下限はゼロになる。範囲は「整数として表せる最大値」を小数部の重みで割った値として解釈されるため、同じ整数範囲でも小数部ビット数を増やすと実数としての最大値は小さくなる傾向がある。

1.2.2 精度量子化誤差

固定小数点は離散化された集合の要素として実数を近似するため、元の実数を格納する際に最寄りの表現値へ写像する必要がある。このとき生じる誤差は量子化誤差と呼ばれ、一般に「表現の刻み幅(分解能)」に比例する。丸め規則や切り捨て規則の選択によって誤差偏りが変わり、同じ刻み幅でも統計的性質が異なることがある。

1.2.3 分解能(最小刻み)

分解能は、隣接する表現値の差に相当する。小数部ビット数を増やすほど分解能は細かくなり、より小さい増分を表現できる。一方で、総ビット数が一定の場合、分解能を高めるために整数部のビットが減り、到達可能な最大値の幅が狭まるため、精度と範囲はトレードオフの関係にある。

1.3 設計パラメータ

1.3.1 総ビット数

総ビット数は格納できる整数の種類を規定し、結果として実数の最大幅と最小幅の双方に影響する。ビット数が増えると、同じ小数部設定でも表現できる値の段階数が増え、範囲拡大または分解能改善のいずれにも寄与する。ただしメモリ使用量や演算器の規模が増えるため、対象デバイスの制約との兼ね合いで決める必要がある。

1.3.2 小数部ビット数

小数部ビット数は分解能と量子化誤差に直結する。増やせば細かい刻みを表現できるが、総ビット数が固定なら整数部のビットが減少し、オーバーフローに対する余裕が小さくなる。設計では、対象信号や係数の最大振幅、演算中の中間値の増大、最終的に許容される誤差を見積もり、適切な配分を行う。

1.3.3 符号あり/符号なし

符号付き固定小数点は正負の両方の値を表現でき、差分演算や偏差の保持に向く。符号なしは実装が単純になる場合があり、処理対象が非負に限定される場面で有利である。符号選択は表現範囲の形状に影響し、同じビット幅でも負方向の余裕が存在するかどうかが決定するため、値の符号特性を早い段階で把握しておくことが重要になる。

2 固定小数点の計算

2.1 加算・減算の挙動

2.1.1 桁あふれ(オーバーフロー)

加算や減算では、結果が表現可能な範囲を超えるとオーバーフローが発生する。固定小数点では小数点位置が固定のため、加算は基本的に同スケール同士で行われるのが通常であり、オーバーフローは主として整数部の上限により決まる。実装では、ラップアラウンド(循環)や飽和などの挙動を定めておく必要がある。これらの方針により、誤差の出方やシステムの安定性が変化する。

2.1.2 丸め・切り捨ての扱い

加算・減算自体は同じ小数部ビット数であれば追加の丸めを要しないことが多い。ただし、異なるフォーマット同士の演算や、スケール調整のためのシフトを含む場合は、不要ビットが生じて丸めまたは切り捨てが必要になる。丸め方針は誤差の統計性や、反復処理における蓄積の性質に影響する。ゆえに、丸めの定義を仕様として固定することが重要である。

2.2 乗算のスケーリング

2.2.1 積の小数点位置

固定小数点の乗算では、2つの入力の小数点位置がそれぞれ固定されているため、積の結果は一般に「小数点位置が2倍の規模だけ深い」位置を持つ形になる。たとえば小数部ビット数がそれぞれ f の場合、積では小数部が 2f になる解釈が自然である。したがって、結果を元のフォーマットに戻すには、適切なビットシフトや丸めを行ってスケールを整える必要がある。

2.2.2 桁数増加と再正規化

乗算では有効桁数が増え、総ビット数の制約に対して結果が大きくなる可能性がある。再正規化とは、目的のフォーマットに合わせてビット長を削る(あるいは拡張する)処理を指し、ここで丸め誤差が発生しやすい。さらに、内部計算は一時的に広いビット幅で保持し、最後に必要な幅へ縮退させる方針が採られることが多い。これにより、途中の切り捨てによる誤差増幅を抑えられる。

2.3 除算と逆数近似

2.3.1 精度劣化の要因

固定小数点の除算では、商の分解能を満たすために桁の扱いが複雑になる。ビットシフトによるスケール調整や、桁数を絞るための丸めが必要になり、結果として相対誤差が拡大する場合がある。特に除数が小さい領域では、商が大きくなることでオーバーフローのリスクも増えるため、設計段階で入力範囲の把握が欠かせない。

2.3.2 桁合わせの手順

除算では、通常「分子を適切にスケールアップしてから整数除算する」手順が用いられる。分子を左シフトして必要な分解能を確保し、その後に整数除算を行って商を得る。最後に、目的の小数部位置へ戻すために右シフトし、丸め規則に基づいてビットを削る。こうした手順を厳密に定義すると、異なる実装間でも結果の差を管理しやすい。

2.4 演算規約(実装方針)

2.4.1 丸めモードの種類

丸めモードには、切り捨て、最近の値へ丸め、上方向への丸めなど複数の方式がある。切り捨ては誤差の符号が偏りやすく、最近丸めは対称性を保ちやすいことが多い。実装では計算器のサポートや、後段の制御系や学習アルゴリズムの要求精度に応じて選択する。丸め規則は仕様に明記し、再現性のために一致させることが望ましい。

2.4.2 飽和(サチュレーション)とラップ

飽和は、表現範囲の上限または下限を超えた場合に、その境界値へ固定する方式である。ラップは超過分が循環的に折り返され、値の意味が別の領域へ移ってしまうことがある。制御や信号処理では飽和の方が挙動を予測しやすい場合が多いが、用途によってはラップのような「モジュロ計算」が意図的に使われることもある。選択は安全性と誤差の挙動に直結するため慎重に決める。

3 浮動小数点との比較

3.1 精度・誤差の違い

3.1.1 量子化誤差と丸め誤差

固定小数点では、表現可能な格子が一様に配置されるため、量子化誤差は主に分解能で決まる。浮動小数点では指数部が調整されるため、相対誤差としての振る舞いが一定になりやすい一方、丸め誤差は演算のたびに発生しうる。固定小数点は丸めの設計を明確にすれば誤差の上界を見積もりやすく、浮動小数点はスケール適応によって広い範囲を扱いやすい。

3.1.2 値のダイナミックレンジ

ダイナミックレンジは扱える値の幅であり、固定小数点は分解能と範囲が一体の設計となるため、適切なスケール設計を外すと表現できない領域が生じやすい。浮動小数点は指数部により大きな値と小さな値の双方を表しやすいが、近い値同士の比較や差分計算では丸めにより意味が変わる可能性がある。目的とする信号の振幅や分布により、どちらが適合するかが決まる。

3.2 性能と実装容易性

3.2.1 ハードウェア実装の観点

固定小数点は整数演算に近い形で扱えるため、組込み機器や専用回路では面積や消費電力を抑えやすい場合がある。乗算器や加算器も比較的単純化できるため、帯域やレイテンシ制約が厳しい場面で採用されることが多い。浮動小数点は指数部や正規化、例外処理などの追加機構により回路規模が増える傾向がある。

3.2.2 速度と消費電力

固定小数点は、メモリ帯域と演算器の両面で効率化しやすい。特にデータ幅が小さい場合、キャッシュ効率や転送量が改善し、結果として総合速度が上がることがある。浮動小数点は汎用性が高い反面、演算の段数や制御の複雑さにより、同一条件での消費電力が増える可能性がある。ただし実際の性能はプロセッサの実装に依存するため、ターゲット環境での評価が必要になる。

3.3 決定性と再現性

3.3.1 同一入力での一致性

固定小数点は演算規約(丸め、飽和、桁数処理)が統一されていれば、同一の前提条件で同一結果が得られる可能性が高い。浮動小数点は計算順序、最適化、レジスタ精度などにより、実行環境差が結果の違いとして表れうる。特にテストや検証が厳密に求められる場面では、固定小数点の決定性が利点になりやすい。

3.3.2 結果の検証・テスト

固定小数点の検証では、量子化誤差の上界や、オーバーフロー時の挙動をテスト観点に含めると良い。代表ケースとしては境界付近の入力、スケール調整に伴う最小・最大の削減、ゼロ付近の挙動などがある。浮動小数点でも同様の観点は必要だが、誤差の分布が状況で変化しやすく、許容誤差の設計がより難しくなることがある。

4 固定小数点の利用と実務

4.1 代表的な用途

4.1.1 デジタル信号処理

デジタル信号処理では、サンプル列を高速に処理する必要があるため、固定小数点が適することが多い。フィルタ係数や窓関数などの係数を固定小数点で保持し、乗算・加算を繰り返しても規約を統一すれば誤差を管理できる。さらに、リアルタイム性やレイテンシ要件に合わせた設計がしやすい点も利点となる。

4.1.2 機械学習の軽量化

機械学習分野では、推論時の計算負荷を抑えるために固定小数点、あるいは整数演算に近い形式が用いられることがある。モデルの重みや中間表現を低精度化することで計算とメモリを削減し、組込み環境でも動作させる狙いがある。精度低下は量子化設計とデータ分布の影響を強く受けるため、校正やテストの工程が重要になる。

4.1.3 制御系(フィードバック)

制御ではセンサー値と制御出力の計算を一定周期で実行するため、決定性が求められやすい。固定小数点は演算規約を固定しやすく、飽和や丸めの選択により応答の挙動を設計できる。特に積分や微分のように誤差が蓄積しやすい段では、オーバーフローや丸め誤差を見込んだフォーマット設計が必要になる。

4.2 値スケーリングの設計

4.2.1 係数の正規化

係数を固定小数点へ写像する際、入力の最大値や信号の動特性に合わせて正規化することで、表現範囲を効率良く使える。スケールを誤ると、過大な値で飽和が多発したり、過小な値で量子化が粗くなったりする。正規化は設計対象の統計、最大振幅、運用条件を踏まえて決めるのが一般的である。

4.2.2 スケール係数の決め方

スケール係数の設定では、目標とする誤差許容と、演算中に生じる中間値の増大を考慮する必要がある。例えば乗算を繰り返す構造では、積の小数点位置や桁増えを見込んで最終的な縮退後の誤差を評価する。実務では、代表データに対する誤差解析や、境界入力に対するオーバーフロー確認を通じて調整する。

4.3 検証と誤差解析

4.3.1 期待値と誤差の見積り

誤差解析では、量子化による平均的なずれや分散の見積もりを行う。誤差の上界(例えば分解能の半分程度)を基準に、繰り返し回数や演算連鎖を通じた増幅を考慮する。厳密な厳密評価が難しい場合でも、統計モデルや実測の双方から妥当な見積りを作り、要求仕様に対する適合性を判断する。

4.3.2 テストケース設計

テストでは、典型ケースだけでなく、表現範囲の端、最小刻み周辺、ゼロ付近の挙動を含めるとよい。乗算ではスケーリング後の丸めが結果に大きく影響するため、ビット境界に近い入力を用意することが有効である。さらに、飽和が起きる場合の応答も事前に確認し、許容される挙動かどうかを判定する。

4.4 実装上の注意

4.4.1 型・ビット幅の管理

固定小数点ではビット幅を適切に管理しないと、意図しない切り捨てや符号拡張の不整合が発生しうる。型変換は演算前のビット解釈を変えてしまうため、キャストの位置や演算順を明確化することが望ましい。中間計算は必要な幅で一時保持し、最終段でのみフォーマットへ戻す方針が安全になりやすい。

4.4.2 計算順序と安全な式変形

同じ数学的式でも、実装では計算順序の違いによりスケール調整回数が変わり、結果の誤差が変化する。特に除算や乗算を含む場合、事前に定数をまとめたり、シフトで置き換えたりすることで誤差やオーバーフローのリスクを抑えられることがある。安全な式変形とは、丸め・飽和規約を前提に誤差増幅を抑え、かつ範囲制約を満たす形に整理することを指す。

4.4.3 例外的ケース(極端値、ゼロ付近)

極端値ではオーバーフローや飽和が発生しやすく、結果の意味が変わる可能性が高い。ゼロ付近では丸めや切り捨てにより不連続な挙動が出ることがあり、符号付きでは符号の扱いにも注意が必要になる。これらの領域は誤差解析でも重点的に扱うべきで、実データに即した確認が性能と安全性の両方に寄与する。