今回の授業の目標
- 浮動小数点数の仕組みを理解する
- 10進数を2進数の浮動小数点数に変換できるようになる
- なぜこの方法が使われるのかを説明できるようになる
1. 浮動小数点数とは
これまで整数の表現について学びましたが、小数部分を含む実数はどのように表現するのでしょうか?
身近な例:科学記号法
理科で習った科学記号法を思い出してみましょう:
- 光の速度:300,000,000 m/s = 3.0 × 10⁸ m/s
- 電子の質量:0.000000000000000000000000000911 kg = 9.11 × 10⁻³¹ kg
この方法により、とても大きな数からとても小さな数まで効率的に表現できます。
コンピュータでの実数表現:浮動小数点数
コンピュータでも同様の方法を使います。実数を以下の3つの部分に分けて表現する方法を浮動小数点数といいます:
符号部 × 基数^指数部 × 仮数部
10進数での例
- $-423$ = (-) × 10² × 4.23
- $0.375$ = (+) × 10⁻¹ × 3.75
2. 2進数での浮動小数点数
コンピュータでは0と1しか使えないため、基数は2、そして次のような工夫をします:
| 部分 | 表現方法 | 説明 |
|---|---|---|
| 符号部 | 0=正、1=負 | 1ビットで正負を区別 |
| 指数部 | バイアス値 ($01111_2=15_{10}$) を加える | 小さな数も表現できるようにする |
| 仮数部 | 最上位の1を省略 | 精度を向上させる |
16ビット浮動小数点数の構成

[符号部1ビット] [指数部5ビット] [仮数部10ビット]
3. バイアス値とは
なぜバイアス値が必要?
指数部にバイアス値(この例では15)を加える理由を、具体的な表で見てみましょう。
5ビット指数部で表現できる指数の対応表
| 実際の指数 | バイアス後の値 | 指数部(5ビット表現) |
|---|---|---|
| 2⁻¹⁵ | $-15 + 15 = 0$ | 00000 |
| 2⁻¹⁴ | $-14 + 15 = 1$ | 00001 |
| 2⁻¹³ | $-13 + 15 = 2$ | 00010 |
| ⋮ | ⋮ | ⋮ |
| 2⁻¹ | $-1 + 15 = 14$ | 01110 |
| 2⁰ | $0 + 15 = 15$ | 01111 |
| 2¹ | $1 + 15 = 16$ | 10000 |
| 2² | $2 + 15 = 17$ | 10001 |
| ⋮ | ⋮ | ⋮ |
| 2¹⁵ | $15 + 15 = 30$ | 11110 |
| 2¹⁶ | $16 + 15 = 31$ | 11111 |
バイアス値を使う理由
1. 小さな数(1以下)を表現するため
- 0.1、0.01、0.001などの小数を表現するには、2⁻¹、2⁻²、2⁻³のような負の指数が必要
- バイアス値15を加えることで、負の指数も正の数として扱える
2. 表現できる数の範囲
- 最小:2⁻¹⁵ ≈ 0.00003(とても小さな数)
- 最大:2¹⁶ = 65,536(大きな数)
- 1つの方式で、とても小さな数から大きな数まで表現可能
4. 変換の実例
例題:10進数「2.5」を16ビット浮動小数点数で表現
ステップ1: 10進数2.5を2進数に変換
2.5 = 2 + 0.5 = 10.1(2)
ステップ2: 浮動小数点数の形に変換
10.1(2) = +2¹ × 1.01(2)
ステップ3: 各部分をビットで表現
- 符号部:+ → 0
- 指数部:1 + 15(バイアス値)= 16 → 10 000
- 仮数部:1.01の最上位1を省略して → 0 100 000 000
結果: 0 10000 0100000000
仮数部は、なぜ最上位の1を省略するのか?
正規化された浮動小数点数では、仮数部は必ず「1.○○○…」の形になります。
- 例:1.000、1.101、1.001など
最上位の1は常に同じなので、記録する必要がありません。省略することで:
- 精度向上:10ビットで11桁分の情報を表現
- 効率化:限られたビット数を有効活用
5. 練習問題
問題1
10進数「1.25」を16ビット浮動小数点数で表現しなさい。
解答:
ステップ1: 10進数1.25を2進数に変換
$$1.25 = 1 + 0.25 = 1 + 1/4 = 1.01_2₎$$
ステップ2: 浮動小数点数の形に変換
$$1.01_2 = (+) × 2⁰ × 1.01_2$$
ステップ3: 各部分をビットで表現
- 符号部:(+) → 0
- 指数部:0 + 15(バイアス値)= 15 → 01111
- 仮数部:1.01の最上位1を省略して → 0100000000
結果: 0 01111 0100000000
問題2
次のビット列が表す10進数を求めなさい: 0 01111 1000000000
解答:
ステップ1: 各部分を読み取る
- 符号部:0 → (+)
- 指数部:01111 = 15 → 15 – 15 = 0 → 2⁰
- 仮数部:1000000000 → 省略された1を復元して $1.1_2$
ステップ2: 浮動小数点数の形で表現
$$(+) × 2^0× 1.1_2= 1.1_2$$
ステップ3: 10進数に変換
$$1.1(2)= 1 + 0.1(2)= 1 + \frac 1 2 = 1.5(10)$$
結果: 1.5
問題3
浮動小数点数で表現できる数の範囲について、整数表現と比較して説明しなさい。
解答:
整数表現(16ビット符号付き)の場合:
- 範囲:-32,768 ~ 32,767
- 特徴:連続した整数をすべて正確に表現可能
浮動小数点数(16ビット)の場合:
- 範囲:約 ±3.0×10⁻⁵ ~ ±6.5×10⁴(2⁻¹⁵ ~ 2¹⁶程度)
- 特徴:
- 表現範囲が圧倒的に広い
- 小数も表現可能
- ただし、すべての数を正確には表現できない(近似表現)
- 大きな数ほど精度が粗くなる
まとめ: 整数表現は狭い範囲を正確に、浮動小数点数は広い範囲を近似的に表現する方法です。
まとめ
- 浮動小数点数は実数を効率的にコンピュータで表現する方法
- 3つの部分(符号部、指数部、仮数部)に分けて表現
- バイアス値により小さな数から大きな数まで表現可能
- 最上位1の省略により精度を向上
次回予告
次回は、浮動小数点数を使った計算で生じる誤差について学習します。なぜ「0.1 + 0.2 ≠ 0.3」になることがあるのか、その理由と対策を探ります。

コメント