1 基本概念

浮動小数点数は、実数を有限のビット列で近似的に表すための方式である。コンピュータは無限の桁をそのまま保持できないため、この表現では値を符号、指数、仮数の組として持ち、広い範囲の数を少ない桁で扱えるようにしている。日常的な数値処理から科学計算まで、実用上の標準的手段として広く用いられる。

1.1 定義

浮動小数点数とは、ある基数に対する冪と有効桁の組み合わせで数を表す形式である。一般には 数 = 符号 × 仮数 × 基数^指数 という形で理解される。ここで仮数は値の精度を担い、指数は小数点の位置を動かす役割を果たす。

1.2 固定小数点数との違い

固定小数点数は、小数点の位置をあらかじめ決めておく表現で、一定範囲内の数を比較的単純に扱える。これに対して浮動小数点数は、小数点位置を指数で調整するため、非常に大きい数と非常に小さい数を同じ形式で表現しやすい。ただし、その柔軟性と引き換えに、精度のばらつきが生じやすい。

1.3 実数近似としての役割

浮動小数点数は実数そのものではなく、近似値を保持する仕組みである。多くの計算では十分な精度を提供するが、連続した演算を重ねると誤差が蓄積する。したがって、結果を厳密値と同一視せず、許容範囲を意識して扱う必要がある。

2 表現方法

浮動小数点表現は、値をいくつかの領域に分けて格納する。典型的には、最上位に符号、その次に指数、残りに仮数を配置する。これにより、同じビット幅でも広い数値範囲を確保できる。

2.1 符号部

符号部は、その数が正か負かを示す。多くの形式では1ビットで表され、正の値と負の値を区別する。符号は数の大きさそのものには関与せず、全体の向きを決める。

2.2 指数部

指数部は、仮数をどの程度倍率するかを定める。指数が大きければ値は増え、小さければ減る。指数域の広さが、その形式で扱える数の範囲を左右する。

2.3 仮数部

仮数部は、有効数字に相当する情報を保持する。ここに多くのビットを割くほど細かな値の違いを区別しやすくなる。反面、指数との配分には限りがあるため、精度と範囲のバランスが重要となる。

2.3.1 正規化

正規化とは、仮数の先頭が一定の形になるよう整えることを指す。これにより、同じ値を一意に近い形で表し、利用可能なビットを有効に使える。多くの標準形式では、正規化された表現が通常の値として扱われる。

2.3.2 非正規化

非正規化は、指数が最小付近にある値を補うための表現である。ごく小さな数を段階的に扱えるようにし、ゼロへ向かう連続性を保ちやすくする。これによって、極小値が急に失われるのを和らげられる。

2.4 基数と桁数

基数は、十進法や二進法のように、数を構成する進法の底を示す。コンピュータでは二進基数が一般的で、ハードウェアとの相性がよい。桁数は保持できる有効情報の量を表し、精度の上限を決める。

3 規格と形式

浮動小数点数は、互換性を保つために規格化されている。標準に従うことで、異なる装置や言語間でも同じ解釈共有しやすくなる。代表的な形式は、日常的な計算から高精度処理まで幅広く使われる。

3.1 国際的な規格

国際的には、IEEE 754が最も広く知られた規格である。この規格は、表現形式、丸め方法、特殊値の扱いなどを定めている。結果として、実装ごとの差異を減らし、予測しやすい数値計算を支えている。

3.2 単精度

単精度は、一般に32ビットで表される形式である。メモリ使用量が少なく、速度面でも有利なため、グラフィックスや大規模計算の一部で使われる。精度は倍精度より低いが、用途によっては十分である。

3.3 倍精度

倍精度は、一般に64ビットで表される形式で、より高い精度と広い範囲を持つ。科学技術計算や数値解析では標準的に用いられることが多い。単精度よりも誤差の影響を抑えやすい。

3.4 拡張精度

拡張精度は、標準的な単精度や倍精度を超える精度を持つ形式である。内部計算の中間結果に使われることがあり、丸めの影響を軽減する目的で採用される。実装依存の部分もあるため、扱いには注意が必要である。

4 計算上の性質

浮動小数点演算では、理論上の実数計算と完全には一致しない。各演算で丸めが起こり、わずかな差が次の計算に影響する。そのため、誤差の見積もりと性質の理解が重要となる。

4.1 丸め

丸めは、無限に続く値や表現しきれない値を有限の形式に収める処理である。どの方向に寄せるかによって結果が変わり、累積誤差にも差が出る。多くの体系では、定められた規則に従って一貫した丸めを行う。

4.1.1 丸め方向

丸め方向には、切り捨て、切り上げ、ゼロ方向への切り詰めなどがある。用途に応じて選ばれ、境界値の扱いに影響する。安全性を重視する分野では、保守的な方向が採用されることもある。

4.1.2 最近接への丸め

最近接への丸めは、最も近い表現可能値を選ぶ方式である。一般に偏りが少なく、長い計算で有利とされる。IEEE 754でも基本的な方式として広く使われている。

4.2 誤差

誤差は、表現値や計算結果が真の値からずれる量である。浮動小数点では避けがたい現象であり、入力の性質と演算順序によって大きさが変わる。誤差の評価は、数値計算の品質管理に直結する。

4.2.1 絶対誤差

絶対誤差は、近似値と真値の差の大きさである。値そのもののずれを直接示すため、単位のある量の評価に向く。小さい数では有効だが、桁の大きい値では相対的な意味合いも併せて見る必要がある。

4.2.2 相対誤差

相対誤差は、真値に対するずれの割合を表す。値の大きさに依存しにくく、広い範囲の比較に便利である。真値がゼロに近い場合は定義や解釈に注意を要する。

4.3 桁落ち

桁落ちは、近い値どうしの減算で有効桁が失われる現象である。大きな数同士を引いて小さな差を得る場面で起こりやすい。結果として、理論的には十分な情報があっても、計算上は精度が急に低下する。

4.4 情報の消失

情報の消失は、演算の過程で細かな差が表現できなくなることを指す。大きな値に小さな値を加えても変化が記録されない場合や、繰り返し計算で微小成分が埋もれる場合がある。これは有限精度表現の根本的な制約である。

5 演算と比較

浮動小数点演算は、通常の算術と同じ記号を使っても、内部では丸めや特殊処理を伴う。比較演算もまた、整数の場合ほど単純ではない。数値の性質を理解した上で扱うことが求められる。

5.1 加算

加算では、指数をそろえたうえで仮数を足し合わせる。指数差が大きい場合、小さい方の寄与が失われやすい。したがって、並べ方や順序が結果に影響することがある。

5.2 減算

減算は、加算と似た処理だが、近い値を引くと桁落ちが生じやすい。差分が小さいほど相対的な誤差が目立つ。数値安定性を高めるには、式の変形が有効な場合がある。

5.3 乗算

乗算では、仮数同士を掛け、指数を加える。加算や減算より構造は単純だが、結果が表現範囲を超えるとオーバーフローが起こる。逆に極端に小さい場合は、下限側の制約を受ける。

5.4 除算

除算では、仮数の割り算と指数の差を計算する。ゼロ割りは特別扱いとなり、無限大や非数が生じることがある。反復計算では、割る数の大きさによって誤差の広がりが変わる。

5.5 大小比較

大小比較は、値の順序を判定する操作である。浮動小数点では、見かけ上同じでも内部表現が異なる場合があり、単純な一致判定が不安定になることがある。比較方法は目的に応じて選ぶ必要がある。

5.5.1 等値比較の注意点

等値比較は、二つの値が完全に同一かを調べるが、近似計算では期待どおりに働かないことが多い。わずかな丸め差でも不一致となるため、厳密一致が本当に必要かを見極める必要がある。実務では、結果をそのまま比較するより、差の評価を用いる場合が多い。

5.5.2 許容誤差による比較

許容誤差による比較は、一定範囲内なら同じとみなす方法である。絶対誤差や相対誤差を基準にすると、数値処理の現実に合いやすい。もっとも、閾値の設定が不適切だと、過大評価や見落としを招く。

6 特殊値

浮動小数点規格は、通常の実数だけでなく、境界的な状態を表す特別な値も定めている。これらは例外処理や計算の継続に役立つ一方、解釈を誤ると不具合の原因になる。

6.1 正の零と負の零

正の零と負の零は、数値としては同じゼロでありながら、符号を持つ区別である。多くの場面では同値に扱われるが、逆数や一部の関数では差が現れることがある。細かな挙動を制御するための仕組みとして機能する。

6.2 無限大

無限大は、表現可能な範囲を超えた結果を示す特殊値である。上限超過やゼロ割りに関連して現れることがある。有限値とは異なる演算規則を持ち、例外の伝播を明示する役割を担う。

6.3 非数

非数は、数として意味を持たない結果を表す。未定義の演算や不正な操作の後に生じることがある。非数は比較や演算で独特の振る舞いを示すため、検出と処理が重要である。

6.4 非正規化数

非正規化数は、ゼロに非常に近い値を表すための領域である。通常の正規化表現では失われるような微小値を段階的に保持できる。これにより、計算の連続性が改善される場合がある。

7 実装と利用

浮動小数点は、理論だけでなく実装の細部によって実際の性質が左右される。ハードウェア、コンパイラ、言語仕様、ライブラリの相互作用により、同じ式でも振る舞いが変わりうる。利用者は、その前提を理解して設計する必要がある。

7.1 硬体での処理

硬体では、浮動小数点演算用の回路が加算、乗算、丸めなどを実行する。高速化のためにパイプライン化されることも多い。演算精度や例外処理の方式は、設計によって差が出る。

7.2 プログラミング言語での扱い

プログラミング言語では、浮動小数点型として提供されるのが一般的である。言語仕様がIEEE 754にどこまで準拠するか、演算順序をどの程度保証するかは異なる。したがって、同じソースでも環境差が結果に表れることがある。

7.3 数値計算での注意点

数値計算では、誤差を増幅しにくい式変形や、安定なアルゴリズムの選択が重要である。単純な式でも、入力データの条件によっては不安定になる。検算、スケーリング、正規化などの工夫がしばしば有効である。

7.4 再現性と移植性

再現性は、同じ条件で同じ結果が得られる性質、移植性は異なる環境でも同様に動く性質を指す。浮動小数点では、コンパイラ最適化やハードウェア差で細部が変化しうる。研究や産業用途では、これらを意識した設計と記録が求められる。

8 応用

浮動小数点数は、幅広い分野で基本的な数値表現として使われている。特に連続量や微小変化を扱う場面で有利であり、現代の計算機応用を支える基盤となっている。

8.1 科学技術計算

科学技術計算では、物理量、化学量、天文学的距離など、桁の大きく異なる値を同時に扱う。浮動小数点はその範囲の広さから適している。誤差管理が成果の信頼性を左右するため、精度選択が重要である。

8.2 工学シミュレーション

工学シミュレーションでは、構造解析、流体計算、回路解析などで大量の演算が行われる。反復法や離散化の過程で誤差が蓄積しやすく、数値安定性が大きな課題となる。現実的な計算時間との兼ね合いも考慮される。

8.3 グラフィックス処理

グラフィックス処理では、座標変換、光源計算、アニメーション制御などに浮動小数点が使われる。映像分野では速度と精度の折衷が重視され、単精度が多用されることがある。視覚的には十分でも、内部では誤差の影響を受ける場合がある。

8.4 機械学習と統計計算

機械学習と統計計算では、大規模な行列演算や確率計算に浮動小数点が不可欠である。学習の安定性や再現性には、精度設定や演算順序が影響する。最近では、高速化のために低精度形式を併用する例も増えている。