浮動小数点数(Floating-Point Number)とは、数を「有効な数字の並び」と「小数点の位置」に分けて記録することで、とても大きな数からとても小さな数までを、限られた記憶の大きさで表せるようにした数の表し方のことです。コンピューターで小数を扱うときの、最も一般的な方式として使われています。
現実世界に例えると、浮動小数点数は「3.0×10の8乗メートル毎秒」のように書く、理科の教科書の数の書き方のようなものです。桁数の多い数でも、数字の部分と桁の大きさに分けて書けば、短く表せます。
名前の意味
言葉の出どころです。「浮動」とは、小数点の位置が固定されておらず、数の大きさに合わせて動くという意味です。これに対し、小数点の位置を決めて表す方式は「固定小数点数」と呼ばれます。小数点を動かせることで、天文学で使うような大きな数も、原子の大きさのような小さな数も、同じ形式で表せるのが特長です。
3つの部分でできている
仕組みの基本です。浮動小数点数は、プラスかマイナスかを表す「符号」、有効な数字の並びを表す「仮数」、小数点の位置を表す「指数」の3つの部分で数を記録します。仮数に多くのビットを使えば細かい数まで正確に表せ、指数に多くのビットを使えば、より大きな数や小さな数まで表せるようになります。
精度による種類
主な形式です。現在の多くのコンピューターは、1985年に定められた「IEEE 754」という国際的な規格に沿って浮動小数点数を扱っています。
| 種類 | 大きさ | 正確な桁数の目安 |
|---|---|---|
| 半精度 | 16ビット | 約3桁 |
| 単精度 | 32ビット | 約7桁 |
| 倍精度 | 64ビット | 約15〜16桁 |
小さな誤差が生まれる
最も注意したい点です。コンピューターは数を2進数で記録するため、10進数の0.1のような身近な小数でも、ぴったりとは表せないことがあります。そのため、多くの言語で0.1と0.2を足すと、0.3ではなく、0.30000000000000004のような結果になります。これはプログラムの誤りではなく、浮動小数点数の性質によるものです。
お金の計算には向かない
使い分けの例です。金額の計算に浮動小数点数を使うと、小さな誤差が積み重なり、1円単位の食い違いが生まれることがあります。そのため、会計や請求のシステムでは、金額を整数の「円」や「銭」で記録したり、10進数のまま正確に計算できる専用のデータ型を使ったりします。データベースでも、金額の列には誤差の出ない数値型を選ぶのが一般的です。
値を比べるときの注意
プログラミングでのこつです。浮動小数点数どうしを「ぴったり等しいか」で比べると、わずかな誤差のせいで、等しいはずの値が等しくないと判断されることがあります。そのため、2つの値の差がごく小さな値より小さければ等しいとみなす、という比べ方がよく使われます。また、計算の順番によって結果がわずかに変わることがある点も覚えておきましょう。
特別な値
通常の数以外の値です。IEEE 754の浮動小数点数には、無限大を表す値や、計算できない結果を表す「NaN(非数)」といった特別な値が用意されています。たとえば、0を0で割るような計算をすると、エラーで止まる代わりにNaNになる言語があります。NaNはどの値と比べても等しくならないという変わった性質を持つため、扱いに注意が必要です。
AIやグラフィックスでの使われ方
最近の動きです。画像の処理やAIの計算では、膨大な数の計算を速く行うことが重視されるため、精度を下げた16ビットやそれ以下の浮動小数点数がよく使われています。精度を少し落としても結果にほとんど影響しない場面では、計算量やメモリを大きく節約できます。GPUやAI向けの半導体は、こうした小さな形式の計算を得意としています。


コメント