浮動小数点数とは(全体像)
浮動小数点数は、小数(実数)をコンピュータの中で表すための決まったルールのこと。世界共通の規格があり、ほとんどのコンピュータがこの方式で小数を扱っている。
考え方は、理科で習う「3.0×10⁸」のような書き方とそっくり。「数字の部分」と「小数点をどこまでずらすか」を分けて持つことで、とても大きい数も小さい数も同じしくみで表せる。小数点の位置が動くので「浮動」小数点と呼ぶ。
数は次の3つに分けて記録される。
- 符号 … プラスかマイナスか(1ビットで表す)
- 指数 … 小数点をどこに置くか(数の大きさを決める)
- 仮数 … 中身の数字そのもの(精度を決める)
押さえるのは、「範囲は指数が、細かさ(精度)は仮数が決める」という役割分担だ。
詳しく:この表だけ覚えれば戦える
ここが記事の心臓部。浮動小数点数は、まず精度2種類のビット内訳が問われる。
単精度と倍精度のビット内訳
| 単精度(float) | 倍精度(double) | |
|---|---|---|
| 全体 | 32ビット | 64ビット |
| 符号 | 1ビット | 1ビット |
| 指数 | 8ビット | 11ビット |
| 仮数 | 23ビット | 52ビット |
| bias | 127 | 1023 |
数は (-1)^符号 × 1.仮数 × 2^(指数-bias) という形で表される。ここでbias(バイアス)は、指数をマイナスもプラスもまとめて正の数で扱うための「下駄」のようなもの。たとえば単精度なら、記録された指数から127を引いた値が本当の指数になる。
つまり、bias を引き算することで「2の何乗ぶん小数点をずらすか」が決まる、というわけだ。
次に、よく問われる特殊値4種。ふつうの数では表せない状態を専用のビット並びで表現する。
特殊値4種
| 特殊値 | 意味 | ビットの特徴 |
|---|---|---|
| ±0 | 符号付きのゼロ | 全ビット0(符号で±) |
| ±∞ | 無限大 | 指数が全部1・仮数が0 |
| NaN | 数でない(Not a Number) | 指数が全部1・仮数が0でない |
| 非正規化数 | 0に近い極小の数 | 指数が全部0 |
NaNは「0÷0」のような答えの出ない計算の結果として現れる。±∞や非正規化数とあわせて、「指数が全部1か全部0か」で見分けるのがコツだ。
わかりやすく言い換えると
要するに、浮動小数点数は「理科の 3.0×10⁸ をコンピュータ流に書いたもの」だ。
①符号 … プラスかマイナスの旗
②指数 … 小数点をどこまでずらすか(数の大きさ担当)
③仮数 … 中身の数字(細かさ担当)
そして「先頭の1は省略」という節約ワザがある(ケチ表現)。正規化した数は必ず「1.〜」で始まるので、その1は書かずに省き、そのぶん仮数の桁を1つ多く使える。つまり、見えないけれど1が頭にある、というわけだ。
試験のツボ
🔴 一番出る:単精度・倍精度のビット内訳
①単精度=32ビット(符号1・指数8・仮数23)、bias127
②倍精度=64ビット(符号1・指数11・仮数52)、bias1023
🔴 次に出る:特殊値の見分け方
①±∞=指数が全部1・仮数0
②NaN=指数が全部1・仮数0でない
③非正規化数=指数が全部0
🟡 押さえると安定:仮数の先頭1は省略する(正規化)
①「1.〜」の1を書かないぶん精度を1桁稼ぐ
②単精度の精度は10進で約7桁
よくある間違い
①「仮数が23ビットだから10進で23桁の精度」→ ✗ 省略した先頭1を含めても10進で約7桁。ビット数と10進の桁数は別もの。
②「NaNは0と同じ」→ ✗ NaNは「数でない」無効な値。0とはまったく別。
③「指数の部分にそのままの指数が入っている」→ ✗ biasを引いた値が本当の指数(単精度は-127する)。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(ビット内訳)
IEEE 754の単精度浮動小数点数に関する次の記述のうち、正しいものはどれか。
- 単精度は全体で64ビットあり、符号1・指数11・仮数52の内訳で構成されている
- 単精度は全体で16ビットあり、符号1・指数5・仮数10の内訳で構成されている
- 単精度は全体で32ビットあり、符号1・指数8・仮数23の内訳で構成されている
- 単精度は全体で32ビットだが、符号を持たず指数9・仮数23の内訳で構成される
解答は 3 だぜ。
単精度は全体で32ビット、内訳は符号1・指数8・仮数23だ。「1・8・23、足して32」とリズムで覚えとけよ。biasは127だな。
選択肢1は倍精度(64ビット・1・11・52)の内訳だ。選択肢2の16ビットは半精度の話で単精度ではない。選択肢4は「符号を持たない」が誤りで、必ず符号ビットが1つあるぜ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | これは倍精度の内訳 |
| 2 | ✗ | 16ビットは半精度 |
| 3 | ✓ | 32ビット・符号1指数8仮数23で正しい |
| 4 | ✗ | 単精度にも符号ビットがある |
オリジナル問題2(特殊値)
IEEE 754の特殊値に関する次の記述のうち、正しいものはどれか。
- NaNは0÷0などの答えが定まらない計算で現れる「数でない」無効な値のことである
- NaNは計算の結果がちょうど0になったことを表す、符号付きゼロの別名のことである
- ±∞は指数部が全て0かつ仮数部も全て0のときに表される無限大のことをいう
- 非正規化数は指数部が全て1のときに表される、絶対値が非常に大きい数である
解答は 1 だぜ。
NaN(Not a Number)は「数でない」無効な値で、0÷0のような答えの定まらない計算で現れる。指数が全部1で、仮数が0でないときがNaNだ。
選択肢2はNaNを符号付きゼロとしている点が誤り。選択肢3は±∞を「指数全0」としているが、正しくは指数全1・仮数0だ。選択肢4の非正規化数は「指数全0」で、極小の数を表すから誤りだぜ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | NaNは答えの出ない計算で現れる無効値 |
| 2 | ✗ | NaNはゼロではない |
| 3 | ✗ | ±∞は指数全1・仮数0 |
| 4 | ✗ | 非正規化数は指数全0で極小の数 |
オリジナル問題3(仮数の正規化)
浮動小数点数の仮数部に関する次の記述のうち、正しいものはどれか。
- 仮数部のビット数がそのまま10進の有効桁数になり、単精度なら23桁の精度を持つ
- 正規化した数は「1.〜」で始まるため先頭の1を省略し、そのぶん精度を1桁分稼ぐ
- 仮数部には小数点の位置を表す情報だけが入り、数字そのものは指数部に格納される
- 仮数部はビット数を増やしても精度は変わらず、表せる数の範囲だけが広がっていく
解答は 2 だぜ。
正規化した数は必ず「1.〜」の形になる。だから先頭の1は省略して書かず、そのぶん仮数の桁を1つ多く使える。これが「ケチ表現」だな。
選択肢1は「ビット数=10進桁数」が誤りで、単精度の精度は10進で約7桁だ。選択肢3は仮数と指数の役割が逆。選択肢4は「精度が変わらない」が誤りで、仮数を増やせば精度(細かさ)が上がるぜ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 単精度の精度は10進で約7桁 |
| 2 | ✓ | 先頭の1を省略し精度を1桁稼ぐ |
| 3 | ✗ | 数字は仮数、小数点位置は指数 |
| 4 | ✗ | 仮数を増やすと精度が上がる |
まとめ
押さえどころ
- 🔴 ビット内訳 = 単精度32ビット(1・8・23/bias127)、倍精度64ビット(1・11・52/bias1023)。
- 🔴 特殊値 = ±∞は指数全1・仮数0、NaNは指数全1・仮数0でない、非正規化数は指数全0。
- 🟡 仮数の正規化 = 「1.〜」の先頭1を省略して精度を1桁稼ぐ。単精度の精度は10進で約7桁。
次に学ぶ
- 基数変換 ── 2進数・10進数・16進数を行き来する計算。浮動小数点数の中身も2進数なので、基数の感覚があると指数や仮数の意味がすっと入る。
- 2の補数表現 ── 整数のマイナスを表すしくみ。浮動小数点数(小数の表し方)と対にして「整数はこう、小数はこう」と並べて覚えると混ざらない。
執筆: SikakuQuest編集部