浮動小数点数とは — 2進数での実数表現・保存方法と仕組み
浮動小数点数の基礎から2進数での実数表現・保存方法、丸め誤差や仕組みまで図解でわかりやすく解説。エンジニア必読の入門ガイド。
2進数の実数は、コンピュータの中で特別な方法で保存されなければならない。コンピュータは2進数の整数(2の累乗の整数)として数を表現するので、基数がないため小数のような非整数の数を直接表現することはできない。浮動小数点とは、指数(累乗)を乗じたときに基数が大きくなったり小さくなったりすることを意味する。
浮動小数点の基本概念
浮動小数点は、数を「仮数(significand または mantissa)」と「指数(exponent)」、「符号(sign)」で表す方式です。これは人間の指数表記(例えば 6.02×10^23)と同じ考え方で、2進数における実数を有限ビットで近似的に表現します。一般に
- 符号:正か負かを示す1ビット。
- 指数部:仮数をどれだけシフト(乗算・除算)するかを示すビット列。バイアス(bias)が用いられ、符号付きの指数を扱いやすくする。
- 仮数(小数部分):有効桁(精度)を表すビット列。正規化(normalized)された表現では暗黙の先頭1(implicit leading 1)が仮定されることが多い。
IEEE 754 標準(代表的な実装)
現在の多くのコンピュータは IEEE 754 標準に基づいた浮動小数点を使います。代表的な形式は次のとおりです:
- 単精度(single, 32ビット):符号1ビット、指数8ビット、仮数23ビット。指数のバイアスは127。
- 倍精度(double, 64ビット):符号1ビット、指数11ビット、仮数52ビット。指数のバイアスは1023。
正規化された数では仮数の先頭ビットは常に1になるため、IEEE 754ではその先頭1を省略して表現し(暗黙の1)、仮数部により多くの有効ビットを与えています。
特殊値と非正規化数
- ゼロ(+0, −0):指数と仮数がすべて0の場合、符号に応じて +0 と −0 が表現される。
- 無限大(±∞):指数がすべて1、仮数がすべて0 のとき。
- NaN(非数):指数がすべて1、かつ仮数が 0 でないとき。計算エラーや未定義の結果を表す。
- 非正規化数(subnormal/denormal):指数がすべて0のとき、暗黙の1が使われず小さい数を表現できる。これによりゼロに連続的に近づけられるが、精度は低下する。
丸めと誤差の性質
浮動小数点は有限ビットしか持たないため、ほとんどの実数を有限ビットで 正確に 表せません。そのため丸め誤差が生じます。IEEE 754 ではいくつかの丸めモードが定義されています(最近接へ丸め、ゼロ方向へ丸め、プラス無限大方向、マイナス無限大方向など)。
よくある問題点:
- 10進では有限小数でも、2進では循環小数になり正確に表せない(例:0.1 は2進で非終端)。
- 桁落ち(catastrophic cancellation):ほぼ等しい数同士の引き算で有効桁が失われる。
- 累積誤差:多数の演算を行うと誤差が積み重なることがある。
簡単な変換例
例えば十進の 5.75 を 2進浮動小数点で表す手順:
- 整数部 5 → 2進: 101
- 小数部 0.75 → 2進: 0.11(0.5 + 0.25)
- 合成すると 101.11 = 1.01111 × 2^2(正規化)
- 仮数部は先頭の「1」を暗黙とし、残りを格納:仮数 = 01111...、指数は 2 をバイアスで表す。
実務上の注意点
- 比較:浮動小数点の等号比較は注意が必要。差が小さい場合は許容誤差(イプシロン)を使って比較する。
- 数値アルゴリズムの選択:丸めや桁落ちに強いアルゴリズムを選ぶことが重要。
- 必要なら高精度型(倍精度や任意精度ライブラリ)を利用する。
以上が2進数における浮動小数点数の保存方法とその仕組みの要点です。IEEE 754 の細かな規定や各言語・プラットフォームでの実装差異にも留意してください。
概要
数学や科学では、非常に大きな数、非常に小さな数を理解しやすくするために、10の累乗で単純化することがよくあります。例えば、1.2兆は1.2 × 10 12 {displaystyle 1.2times 10^{12}} と読む方が1,200,000,000,000よりずっと簡単です。これは負の10の累乗でも使えるので、0.000001 {displaystyle 0.000001}
を1 × 10 - 6 {displaystyle 1times 10^{-6}} と表現することができます。
.このような表記方法を科学的記数法といいます。
コンピュータは整数と2進数に限定されているため、小数点の10進数を簡単に表現できないことになる。分数を表現するために、コンピュータは浮動小数点数を用いて、科学的記数法で数を2つの部分に分割する。シグニフィカンドは数の整数版であり、指数はベースに乗じるべき乗である。
シグニフィカント
シグニフィカンドは、実数から基数を取り除き、整数にすることで求められます。例えば、1101.0111 {displaystyle 1101.0111} は、11010111 {displaystyle 11010111}
となります。これは10進数で1.45 {displaystyle 1.45}
を145 {displaystyle 145}
にするのと同じで、意味は全く違うが基数を除けば同じ数字である。科学的記数法がシグニフィカンドをできるだけ基本にするのと同様に、浮動小数点数では整数にしてバイトで表現して計算で使えるようにすることが目的です。
指数
指数は基数点が過去に移動した桁数です。左に移動した場合は指数が正になり、右に移動した場合は負になります。上の例では、2進法が4桁左に移動したので、指数は 00000100 {displaystyle 00000100} (2 4 {displaystyle 2^{4}}
の4を表す) になります。分数を表すように点が右に移動する場合は、指数は負になります(例えば、1桁右に移動すると、2 - 1 {displaystyle 2^{-1}}
または 11111111 {displaystyle 11111111}
; negative binary numbers を参照してください)。
結果
結果は、シグニフィカントと指数を合わせて求めます。上記の例のいくつかを使って
バイナリーポイント | シグニフィカント | 指数 | 結果 |
1101 .0111) | 1101 0111 | 0000 0100 | 1101 0111 0000 0100 |
0000.0111 | 0000 0111 | 1111 1111 | 0000 0111 1111 1111 |
関連ページ
質問と回答
Q:実数とは何ですか?
A:実数とは10進数で表せるすべての数のことで、分数や無理数を含みます。
Q:コンピュータは2進数をどのように記憶しているのですか?
A:コンピュータは2進数を2の累乗である整数として記憶しています。
Q:コンピュータが小数のような非整数を表現する直接的な方法はあるのでしょうか?
A:いいえ、基数が存在しないので、コンピュータが非整数を小数のように表現する直接的な方法はありません。
Q:浮動小数点数表示の目的は何ですか?
A:浮動小数点表現は、指数(累乗)を乗じたときに基数を高くしたり低くしたりすることで、基数を持たないという問題を回避することを可能にします。
Q:浮動小数点表現における「浮動」とは何を指しているのですか?
A:「浮動」とは、指数(累乗)を掛けたときに、基数点が高くなったり低くなったりすることを指します。
Q:指数(累乗)はどのように計算するのですか?
A:指数(累乗)は、ある基数をある回数だけ掛け合わせることで算出されます。例えば、2×2×2=8なので、2^3=8となります。
百科事典を検索する