実数の表現

実数の表現z nビットの実数表現では 2n 種類の実数しか表現できない．
z 実数は不可算無限である．
z コンピュータ上では限られた範囲の実数しか扱えない．
z コンピュータ上では限られた精度でしか実数を表せない．

z 実数の表現では誤差の問題が常に生じる．
z 特定のビット幅に収まり切らなかった数は丸め誤差となる．

z 実数の表現の例:
z 固定小数点表現
z 浮動小数点表現

九州大学工学部電気情報工学科（2006年度）

固定小数点表現
z 決められたビット幅 n に，実数 m を2進数に表現したものをそのまま入れる．
z このとき上位，ならびに下位の余ったビットには 0 を補填する．
z 小数点は特定のビットの右にあるものと考える．
z 最上位ビットは符号を表す符号ビットとして使用してもよい．mが正ならば符号ビットは 0，負ならば符号ビットは １ にする．
z 符号なし整数表現や符号つき絶対値表現は固定小数点表現の特別な形式である．（小数点が右端にある．）–7.8125(10) 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0MSB

2221 20

2-1 2-22-4

LSB

小数点

7(10)

.8125(10)
九州大学工学部電気情報工学科（2006年度）

浮動小数点表現（１）z 科学記数法： 科学技術計算における実数の表記法．
通常の記数法:3.141592…，2.718281828… etc.
科学記数法:
6.02 * 1023，1.60*10–19 etc.
6.02や1.60にあたる部分を仮数と呼ぶ．
23，–19にあたる部分を指数，10を基数と呼ぶ．

z 科学記数法では正規化が行われる．
z 仮数の整数部は常に1桁とする．
z 仮数の整数部は常に 0 以外の数とする．

z 浮動小数点表現は科学記数法の2進数版ある．
z 基数は10ではなく2とする．
z 正規化の結果，浮動小数点表現では仮数の整数部は常に1となる．

z C言語の float/double 型は「浮動小数点表現」．
九州大学工学部電気情報工学科（2006年度）

浮動小数点表現（２）
基本的な発想:z 特定の幅のビット列を上から順に下記の3つのフィールドに分割する．
z 最上位ビットを符号ビット（常に1ビット）として．
z あるビット幅を指数部として．
z 残りの部分を仮数部として．

z 実数の符号を符号ビットで表現する．（非負のとき0，負のとき1）z 実数を正規化された2進科学記数法で表現し，指数を指数部に，仮数を仮数部に格納する．
– 1.0101101 * 21010
符号MSB

指数部

仮数部
LSB
九州大学工学部電気情報工学科（2006年度）

IEEE754（１）z IEEE754 は浮動小数点表現の標準規格である．
z 単精度表現と倍精度表現の2種類の表現が定義されている．
単精度

倍精度

指数部

仮数部

8ビット

23ビット

指数部

仮数部

11ビット

52ビット
符号ビット

1ビット
九州大学工学部電気情報工学科（2006年度）

IEEE754（２）仮数部の表現:z 仮数部には，正規化後の仮数の小数部が固定小数点表現で格納される．小数点の位置は仮数部の最上位ビットの左とする．
z 正規化後，仮数の整数部は常に1（＝ implicit MSB）となるので，データ表現中に格納する必要がない．（けち表現）– 1 . 0101101 * 21010

1

指数部

01011010000000000000000
小数点
九州大学工学部電気情報工学科（2006年度）

IEEE754（３）指数部の表現:z n ビットの指数部は，実際の指数より，2n–1–1 大きい整数を符号なし整数表現で格納する．（バイアス表現，ゲタ履き表現）
z 単精度（指数部=8ビット）では，実際の指数より127大きい整数を格納．したがって，可能な指数は –127 から 128 まで．（本当は–126から127まで．）
z 倍精度（指数部=11ビット）では，実際の指数より1023大きい整数を格納．したがって，可能な指数は –1023 から 1024 まで．（本当は–1022から1023まで．）– 1 . 0101101 * 21010+127110001001

仮数部

九州大学工学部電気情報工学科（2006年度）

IEEE754（４）
例外的な表現:z 指数部が 000…0 のときは特別．
z 仮数部が xxx…x のとき、単精度の場合は 0.xxx…x * 2–126、 倍精度の場
合は0.xxx…x * 2–1023と解釈する（非正規化数）．
z すなわち，0 は 000…0 と表現される（指数部と仮数部は全て0）．

z 指数部が 111…1 のときは特別．
z 仮数部が 000…0 のときは，符号ビットの値に応じて +∞ または –∞ と解釈する．
z 仮数部が 000…0 でないときは，非数（NaN）と解釈する．

九州大学工学部電気情報工学科（2006年度）

IEEE754（5）オーバーフロー：指数部で表現できないほど値が大きい
z 単精度の場合，絶対値が 2128 以上の値は表現できない．
z 倍精度の場合，絶対値が 21024 以上の値は表現できない．
アンダーフロー：指数部で表現できないほど値が小さい
z 単精度の場合，絶対値が2-126未満の非零値は表現できない．
z 倍精度の場合，絶対値が2-1022未満の非零値は表現できない．
補足：
IEEE754規格では不正規化数をサポートしている。これにより，2Emin（Eminは単精度で－126，倍精度で－1022）未満の値を表現できるようになる．値は0.仮数部×2Eminとなり，このような場合を漸進アンダーフローと呼ぶ．

九州大学工学部電気情報工学科（2006年度）

IEEE754（6）浮動小数点表現（単精度）

範囲

間隔

0 00000000 ****…********±0.000..0*2–126～±0.111..1*2–126

2–149* 00000001 ****…********±1.000..0*2–126～±1.111..1*2–126

2–149* 00000010 ****…********
・・・* 11111110 ****…********±1.000..0*2–125～±1.111..1*2–125・・・±1.000..0*2+127～±1.111..1*2+127

2–148・・・
2+104

不正規化数として表現可能な範囲（漸進アンダーフロー）

正規化数として表現可能な範囲–149–2+128–2+127

オーバーフロー（表現できない範囲）–2–125 –2–2–124 –2–126

223個の実数+2–149 –2–125+2–126 +2–124

0+2+127+2+128

オーバーフロー（表現できない範囲）

アンダーフロー
九州大学工学部電気情報工学科（2006年度）（表現できない範囲）

IEEE754（まとめ）z 単精度表現（32ビット）と倍精度表現（64ビット）を定義
31 30

符号（S）

23 22

指数部（E）

0仮数部（F）

63 62

符号（S）

52 51

指数部（E）

0仮数部（F）

z 正規化数以外（非正規化数、無限大、非数など）の表現も可能
単精度の場合
EとF

数値

正規表現

0 < E < 255(−1) S × (1 + F ) × 2( E −127)

非正規表現

E=0, F≠0(−1) S × (0 + F ) × 2( −126)ゼロ

E=0, F=0(−1) S × 0

非数（∞− 1 等）

• EとFの値によりどの表現に相当するか一意に定まる• E=255の場合は指数部が全て‘1’

E=255, F≠0 NaN (Not a Number)
E=255, F=0(−1) S × ∞九州大学工学部電気情報工学科（2006年度）

浮動小数点加算（１）1. 指数部を比較し，指数部の小さい方の仮数部を，指数部が等しくなるまで右シフトする．（＝1ビット右シフトすると指数部を1増やす．）
符号 指数部：ゲタは3(10)

仮数部

000 1 10 0 1

1. 1 1 1 0
1. 1 0 0 1+1.1110 * 20+1.1001 * 2–2000 1 10 1 0

1. 1 1 1 0
0. 1 1 0 0+1.1110 * 20+0.1100 * 2–1000 1 10 1 1

1. 1 1 1 0
0. 0 1 1 0+1.1110 * 20+0.0110 * 20

九州大学工学部電気情報工学科（2006年度）

浮動小数点加算（２）2. 仮数部を加算する．
仮数部

0 1 10 1 1

1. 1 1
1. 1 1 1 0+) 0. 0 1 1 0+1.1110 * 20+0.0110 * 20

0 1 11 0. 0 1 0 0+10.0100 * 20

符号

指数部

000

九州大学工学部電気情報工学科（2006年度）

浮動小数点加算（３）3. 結果を正規化する．仮数部の整数部が 1 になるまで，仮数部を右／左シフトする．（＝1ビット右／左シフトすると指数部を1増やす／減らす．）
00 1 1 1 0. 0 1 0 0+10.0100 * 200

1 0 0+1.0010 * 21

1. 0 0 1 0z 正規化の結果，オーバーフローまたはアンダーフローが発生していないかチェックする（つまり、計算結果が表現できる実数の範囲を超えていないか確認する）．
z 正規化のあと丸め処理を行う．丸め処理の結果が正規形でない場合は，再度正規化を行う．
九州大学工学部電気情報工学科（2006年度）

浮動小数点乗算（１）1. 指数部を加算する．加算した後，ゲタ（指数部が n ビットのとき 2n–1–1 ）を引く．

×)

1 10 1 10 0 1

1 1 1 1 01 1 0 0 1+1.1110 * 20–1.1001 * 2–2?

? ? ? ? ?
1 0 00 1 1 ←ゲタ±?.???? * 21?

0 0 1? ? ? ? ?

±?.???? * 2–201－)

九州大学工学部電気情報工学科（2006年度）

浮動小数点乗算（２）2. 仮数部を乗算する．

×)01

1. 1 1 1 0
1. 1 0 0 1+1.1110 * 20
–1.1001 * 2–2

1 1 1 1 0
0 0 0 0 0
0 0 0 0 0
1 1 1 1 0
1 1 1 1 0

符号無し加算0 1 10 0 1

1 0. 1 1 1 0 1 1 1 0?

±10.11101110 * 2–2

0 0 1 1 0. 1 1 1 0
九州大学工学部電気情報工学科（2006年度）

浮動小数点乗算（３）3. 結果を正規化する．仮数部の整数部が 1 になるまで，仮数部を右シフトする．（＝1ビット右シフトすると指数部を1増やす．）?

0 0 1 1 0. 1 1 1 0±10.1110 * 2–2?

0 1 0±1.0111 * 2–1

1. 0 1 1 1z 正規化の結果，オーバーフローまたはアンダーフローが発生していないかチェックする（つまり、計算結果が表現できる実数の範囲を超えていないか確認する）．
z 正規化のあと丸め処理を行う．丸め処理の結果が正規形でない場合は，再度正規化を行う．
九州大学工学部電気情報工学科（2006年度）

浮動小数点乗算（４）4. 符号を確定する．結果の符号ビットは，掛けられる数と掛ける数の符号ビットが等しければ 0，等しくないとき 1 とする．

×)0
10 1 10 0 1

1 1 1 1 0
1 1 0 0 1+1.1110 * 20–1.1001 * 2–2

10 1 01 0 1 1 1–1.0111 * 2–1

九州大学工学部電気情報工学科（2006年度）

浮動小数点乗算（精度に関する考察）
z 先に示した浮動小数点乗算で得られた結果－1.875 * 20 × 1.5625*2－2 = －1.4375*2－1（+1.1110(2) * 20） （–1.1001(2) * 2–2）（–1.0111 (2)* 2–1）

z 先に示した浮動小数点乗算での正しい演算結果－1.875 * 20 × 1.5625*2－2 = －1.46484375*2－1（+1.1110(2) * 20） （–1.1001(2) * 2–2） （–1.011101110(2)* 2–1）

なぜ、値が異なるのだろう？
仮数部の乗算を行った際に下位4ビットを切り捨てた！
（つまり、演算結果は丸められている！）→丸め誤差
九州大学工学部電気情報工学科（2006年度）