IEEE 754の解読: 32ビット浮動小数点数
0 と 1 しか理解できないコンピューターが、どのようにして 14.0 や 3.14 のような小数を保存できるのか不思議に思ったことはありませんか?その答えは、IEEE 754 という賢明な規格にあります。
この記事では、32ビット浮動小数点数がどのように機能するかを分解し、実際の例を一緒に解読してみましょう。複雑に聞こえても心配しないでください。一つずつ段階を追って説明します!
32ビットFloatの構造
32ビット浮動小数点数は、次の3つの部分に分かれています:
- 符号 (Sign: S): 数値が正か負かを示す1ビット。
- 指数 (Exponent: E): 数値のスケール(大きさ)を決定する8ビット。
- 仮数 (Fraction: F): 数値の実際の数字を表す23ビット。
以下は、32ビットがどのように配置されているかを示す視覚的な表現です:
Arch Note
Interactive logic enabled. Click components in expanded view for technical service definitions.
(注:上の図は、ビットの分布を示すためにMermaidのパケット構文を使用しています)
これを10進数に戻すための公式は次のとおりです:
(-1)^S × 2^(E - 127) × (1 + F)
この公式を使って、実際の問題を解いてみましょう。
問題
IEEE-754規格に従って、以下の32ビット浮動小数点数の10進数に相当するものはどれですか?
01000001011000000000000000000000a) 0.1875 b) 0.4375 c) 6.0 d) 14.0
ステップバイステップで解決しましょう!
ステップ 1: ビットを分割する
まず、32ビットのシーケンスを3つの部分に分割します:
- 符号 (1ビット):
0 - 指数 (8ビット):
10000010 - 仮数 (23ビット):
11000000000000000000000
ステップ 2: 符号 (S) を決定する
最初のビットは 0 です。
0は、数値が 正(プラス) であることを意味します。1は、数値が負(マイナス)であることを意味します。
したがって、S = 0 です。公式では、(-1)^0 = 1 になります。
ステップ 3: 指数 (E) を計算する
次の8ビットは 10000010 です。この2進数を10進数に変換する必要があります。
2進数の各位置が2の累乗を表すことを思い出してください:
1 × 2^7=1280 × 2^6=00 × 2^5=00 × 2^4=00 × 2^3=00 × 2^2=01 × 2^1=20 × 2^0=0
それらを足し合わせます:128 + 2 = 130。
したがって、E = 130 です。
公式では E - 127 を使用します(127は「バイアス」と呼ばれます)。
実際の指数の累乗は 130 - 127 = 3 になります。
したがって、2^3、つまり 8 を掛けます。
ステップ 4: 仮数 (F) を計算する
残りの23ビットは 11000000000000000000000 です。
仮数部分については、-1 から始めて2の累乗を下向きに計算します:
- 最初のビットは
2^{-1}(または0.5)を表します - 2番目のビットは
2^{-2}(または0.25)を表します - 3番目のビットは
2^{-3}(または0.125)を表し、以下同様です。
仮数は 11 で始まり、残りは 0 です:
- ビット1は
1→1 × 0.5 = 0.5 - ビット2は
1→1 × 0.25 = 0.25 - 残りは
0→0
それらを足し合わせます:F = 0.5 + 0.25 = 0.75。
公式では (1 + F) を使用するため、1 + 0.75 = 1.75 になります。
ステップ 5: 全てを組み合わせる
さて、元の公式に値を当てはめます:
(-1)^S × 2^(E - 127) × (1 + F)
- 符号部分:
1 - 指数部分:
2^3 = 8 - 仮数部分:
1.75
1 × 8 × 1.75 = 14.0
最終的な10進数は 14.0 です。
[!TIP] 回答: 正解のオプションは d) 14.0 です!
これがコンピューターが小数を保存する方法です!符号、指数、仮数に分割することで、1と0の単純な文字列で、信じられないほどの精度で膨大な範囲の小数を表現できます。