😊

小数の変換から学ぶ固定小数点数と浮動小数点数

2025/01/24に公開

コンピュータが数値をどのように内部で表現しているのかを理解することは、プログラミングやアルゴリズムを学ぶ上で非常に重要です。本記事では、小数を2進数に変換する方法を起点に、固定小数点数と浮動小数点数の違いや、それぞれの利点と欠点について解説します。最後に、浮動小数点数の標準規格であるIEEE754についても具体例を挙げて詳しく説明します。

小数の2進数変換

小数を2進数に変換する手順

コンピュータは10進数ではなく、2進数で数値を扱います。そのため、小数を扱う場合は10進数から2進数への変換が必要です。

ステップ 1: 整数部分の変換

整数部分を2進数に変換するには、整数を2で割り、その余りを記録します。この操作を繰り返し、最終的に余りを逆順に並べます。

例:

5 ÷ 2 = 2 あまり 1
2 ÷ 2 = 1 あまり 0
1 ÷ 2 = 0 あまり 1
結果: 101 (2進数)

ステップ 2: 小数部分の変換

小数部分を2進数に変換するには、小数部分を2倍し、その結果の整数部分を記録します。この操作を繰り返して小数部分が0になるか、十分な精度に達するまで行います。

例:

0.375 × 2 = 0.75 → 整数部分: 0
0.75 × 2 = 1.5 → 整数部分: 1
0.5 × 2 = 1.0 → 整数部分: 1
結果: 0.011 (2進数)

ステップ 3: 全体の結合

整数部分と小数部分を結合して、最終的な2進数表現を得ます。

例:

整数部分: 101
小数部分: 0.011
結果: 101.011 (2進数)

固定小数点数と浮動小数点数

小数を扱う方法として、固定小数点数と浮動小数点数の2つがあります。それぞれの特徴を詳しく見ていきましょう。

固定小数点数

固定小数点数では、小数点の位置をビット列の特定の位置に固定します。これにより、整数部と小数部のビット数が固定されます。

特徴

  • 利点:
    • 計算が高速かつ簡単。
    • メモリ消費が予測可能。
  • 欠点:
    • 表現できる範囲が狭い。
    • 小数点位置が固定されているため、柔軟性に欠ける。

例:

8ビットの固定小数点数(整数部4ビット、小数部4ビット)で10.375を表現すると:

1010.0110 (2進数)

浮動小数点数

浮動小数点数では、小数点の位置を可変とし、数値を指数と仮数で表現します。これにより、非常に大きな値や非常に小さな値を効率的に表現できます。

特徴

  • 利点:
    • 幅広い範囲の数値を表現可能。
    • 小数点の位置が可変のため、柔軟性が高い。
  • 欠点:
    • 計算が複雑。
    • 丸め誤差が発生する可能性。

例:

IEEE754 単精度形式では、数値は以下のように分割されます:

符号ビット | 指数部 | 仮数部
1          | 8ビット | 23ビット

IEEE754 浮動小数点数の規格

浮動小数点数の表現方法として、IEEE754規格が広く使用されています。この規格では、符号ビット、指数部、仮数部の3つに分けて数値を表現します。

基本構造

項目 単精度 (32ビット) 倍精度 (64ビット)
符号 1ビット 1ビット
指数部 8ビット 11ビット
仮数部 23ビット 52ビット

バイアス形式

指数部は通常の2進数では負の値を表現できません。そのため、バイアス形式を使用し、負の指数も表現可能にしています。

  • 単精度ではバイアス値は127
  • 倍精度ではバイアス値は1023

例: 単精度 (32ビット) の場合

実際の指数値が2の場合:

保存する指数値 = 実際の指数値 + バイアス値
129 = 2 + 127
129 (10進数) → 10000001 (2進数)

数値の例: -5.75

以下の手順でIEEE754形式に変換します。

  1. 2進数に変換:
-5.75 = -101.11 (2進数)
  1. 正規化:
-101.11 = -1.0111 × 2^2
  1. 符号ビット:
負の数なので 1
  1. 指数部:
2 + 127 = 129 → 10000001 (2進数)
  1. 仮数部:
0111 → 01110000000000000000000

最終的な32ビット表現:

1 | 10000001 | 01110000000000000000000

16進数表記では:

C0B80000

固定小数点数と浮動小数点数の比較

特徴 固定小数点数 浮動小数点数
小数点の位置 固定 可変
計算の速度 高速 複雑でやや遅い
精度 一定 状況に応じて可変
数値の範囲 狭い 広い
使用例 金融計算など 科学計算、グラフィックス処理

まとめ

小数の変換方法を基礎として、固定小数点数と浮動小数点数の特徴や用途を理解することで、コンピュータ内部の数値表現に対する深い洞察を得ることができます。特に浮動小数点数の標準規格であるIEEE754は、広範囲の数値を正確かつ効率的に扱うための重要な仕組みです。

次回は、浮動小数点数における丸め誤差やその解決方法について解説します。

演習問題

以下の問題を解いて、固定小数点数と浮動小数点数の理解を深めましょう。

問題 1: 固定小数点数の変換

次の10進数を固定小数点形式(整数部4ビット、小数部4ビット)に変換してください。

  1. 10.375
  2. 7.625

問題 2: 浮動小数点数のIEEE754形式

次の10進数を単精度(32ビット)IEEE754形式に変換してください。

  1. 0.15625
  2. -13.875

解答と解説

問題 1: 固定小数点数の変換

  1. 10.375:

    • 整数部分: ( 10 = 1010 )
    • 小数部分: ( 0.375 → 0110 )(小数部分の変換を参照)
    • 結果: 1010.0110
  2. 7.625:

    • 整数部分: ( 7 = 0111 )
    • 小数部分: ( 0.625 → 1010 )
    • 結果: 0111.1010

問題 2: 浮動小数点数のIEEE754形式

  1. 0.15625:

    • 2進数: ( 0.00101 )
    • 正規化: ( 1.01 × 2^{-3} )
    • バイアス加算: ( -3 + 127 = 124 )
    • 結果:
      • 符号ビット: ( 0 )
      • 指数部: ( 01111100 )
      • 仮数部: ( 01000000000000000000000 )
      • 最終形式: 0 01111100 01000000000000000000000
  2. -13.875:

    • 2進数: ( -1101.111 )
    • 正規化: ( 1.101111 × 2^3 )
    • バイアス加算: ( 3 + 127 = 130 )
    • 結果:
      • 符号ビット: ( 1 )
      • 指数部: ( 10000010 )
      • 仮数部: ( 10111100000000000000000 )
      • 最終形式: 1 10000010 10111100000000000000000

Discussion