m桁
4.情報の内部表現の基礎
(3)
実数の内部表現
Floating-point format
様々な物理量は実数値で表現される。実数を表現できるようになると,コンピュータの応用範囲は大きく 広がる。コンピュータ内部で実数を表現する標準的な方法が“浮動小数点形式”だ。浮動小数点形式を使う ことで,非常に小さい値から非常に大きな値までを,限られた個数のビットで表すことができる。
実数の表現
10 進数の例
10.5
3.1415926...
1353.245
5.62 × 10
24 上に挙げたのは実数実数実数を10 進数で表現した例である.コンピュータ内部では有限個実数 有限個有限個 の有限個のの ビットのビットビットビット でで 数値でで数値数値数値 ををを 表を表表 す表すすす. したがって実数を表現するとき,その10進数としての桁数は有限個となる.もう少し正確に言えば,有効桁有効桁有効桁有効桁 数 数 数 数 がががが 有限有限有限となる. 有限 コンピュータ内部の実数の表現について紹介する前に,桁数が有限の10 進数で実数を表現する方法を考え て見よう.固定小数点
固定小数点
固定小数点
固定小数点(
fixed point number
)
正負を表すための符号,少数点以上
m
桁,小数点以下
n
桁併せて
m + n
個の数字で実数を表す.
*例:
+14314.02621
-00251.40000
mとnはあらかじめ定めた値とする.つまり小数点の位置が固定されているため,「固定小数点」表現と呼 ばれる.この方法では有効桁数はm+nである.また,これにより表される数値の絶対的な精度(つまり刻み の幅)は常に一定である. * この例では説明を簡単にするため,小数点より上の最上位の桁がm に満たない場合や,小数点以下の桁数がn に満た ない場合はゼロを挿入して表している.浮動小数点
浮動小数点
浮動小数点
浮動小数点(
floating point number
)
正負を表すための符号,数字の並びを表す部分(仮数),そして小数点の位置を表す数字(指数)で
実数を表す.
例 15.25 (= +0.1525 × 10
2)
-0.03451(= - 0.3451 × 10
-1)
59.62 × 10
9(= +0.5962 × 10
11)
+ 0. 5962 × 10
11符号
仮数
基数 指数
図4-1 正規化された浮動小数点表現(10 進数)---
実 数 実 数 実 数実 数 (real number),浮 動 小 数 点浮 動 小 数 点浮 動 小 数 点浮 動 小 数 点 (floating point number)実数の表現形式の1つ。仮数×基数
指数
の形になる。 符 号
符 号 符 号
符 号 (sign), 仮 数仮 数仮 数仮 数 (mantissa),指 数 (指 数指 数指 数 exponent), 基 数基 数基 数 (基 数 radix), 正 規 化 正 規 化 正 規 化 正 規 化 (normalization)仮数部の最上位が0以外の値になるように指数の値を調整すること。 n桁 2 1
上の例は,いずれも有効数字(すなわち仮数の桁数)は4 桁である(括弧の中に示したのは正規化された 表現).小数点の位置が固定されていないため,「浮動小数点」表現と呼ばれる.
浮動小数点
浮動小数点
浮動小数点
浮動小数点 の
の
の
の 内部表現
内部表現
内部表現
内部表現
それではコンピュータ内部での浮動小数点表現はどのようになっているだろうか.まず,小数点以下
の桁を持つ2進数について復習する.
小数点以下の2進数
2 進数の小数点以下
n
桁目は
2
−n2 進→1 0 進の変換は簡単
3125
.
0
0625
.
0
25
.
0
2
2
2
01011
.
0
2=
−2+
−4+
−5=
+
+
1034375
.
0
=
10
10
10
10 進
進
進
進 (
(
(
( 小数点以下
小数点以下 )
小数点以下
小数点以下
)
)
) →
→
→
→ 2
2
2
2 進
進 の
進
進
の
の
の 変換
変換
変換
変換 (「
(「
(「
(「 乗算
乗算 シフト
乗算
乗算
シフト
シフト
シフト 法
法
法
法 」)
」)
」)
」)
符号なし整数の10進→2進変換と同じような考え方をする.2進数表現で2を乗ずると左に1桁シフト する.したがって,10進数表現の小数点以下の数に2を乗ずると,小数点以上に1が繰り上がってくる(つ まり乗算結果が1以上になる)ときの少数点以下第1桁は“1”であることがわかる.つまり,小数点以下 の数に2を乗じながら1の位に繰り上がってくる数字を順に並べていくことで,小数点以下の2進数の並び が得られる.0 .3 4 3 7 5 ×2 =0 .6 8 7 5
0 .6 8 7 5 ×2 =1 .3 7 5
0 .3 7 5 ×2 =0 .7 5
0 .7 5 ×2 =1 .5
0 .5 ×2 =1 .0
→0 .0 1 0 1 1
注意
注意
注意
注意
小数点以下の桁を持つ10進数を完全に(誤差ゼロで)2進数に変換することはできないことがある.例:0.3 を2 進数に
0.3 × 2 = 0.6
0.6 × 2 = 1.2
0.2 × 2 = 0.4
0.4 × 2 = 0.8
0.8 × 2 = 1.6
+ 1.010...01 × 2
5符号
仮数
指数
図4-2 正規化された浮動小数点表現(2進数)
3 40.6 × 2 = 1.2 →あとは繰り返しになる
以上より,
0.3 = 0.0100110011001・・・・
= 0.01001 (循環少数になる)
5実数の内部表現:
IEEE-754
浮動小数点
浮動小数点
浮動小数点 フォーマット
浮動小数点
フォーマット
フォーマット
フォーマット
符号ビットS,仮数部M,指数部Eで表す.整数の表し方とは全く異なっている.
23 2 1 0 6 7E
E
M
M
M
E
S
⋯
⋯
⋯
⋯
S
E
M
S:sign,符号
E:exponent,指数
M:mantissa,仮数
S,E,M はそれぞれ2進数である.例えば32 bit 長の場合は,
2 23 2 1 127 ) E E (E S)
M
M
(1.M
2
(-1)
7 6 0 2⋯
⋯
⋯ ⋯×
×
−という数値を表している.
32 bit 長の場合,以下のようになる.
●S=0 なら正の数値,S=1 なら負の数値を表している
●指数部は、「オフセットバイナリ」形式で表現される。
● 0 6 7E
E
E
⋯
⋯
=0000
0000 と
0 6 7E
E
E
⋯
⋯
=1111
1111 は特殊な用途に用いる.このた
め指数の範囲は
1262
−から
1282
+までとなる.
#「特殊な用途」とはゼロ
ゼロ
ゼロ,非数
ゼロ
非数
非数,無限大
非数
無限大
無限大である.非数(
無限大
NaN
,
Not a Number
)は数値でな
いデータであることを表し,例えば,0を0で除算しようとした時に返される結果の表現な
どに使われる。無限大は、演算の結果の絶対値が表現できる限界を超えた(オーバフロー)
場合に使われる。
表4-1 IEEE-754浮動小数点フォーマットにより表現される数値
条件
表現
されている
数値
254
E
E
E
1
≤
7 6⋯
0≤
(
1 2 23)
127 E E E SM
M
M
.
1
2
)
1
(
7 6 0⋯
⋯・
・
−
−0
E
E
E
7 6⋯
0=
0
M
M
M
1 2⋯
23≠
(
1 2 23)
126 S2
0
.
M
M
M
)
1
(
−
・
・
⋯
−0
E
E
E
7 6⋯
0=
0
M
M
M
1 2⋯
23=
(
1
)
0
S・
−
255
E
E
E
7 6⋯
0=
0
M
M
M
1 2⋯
23=
∞
・
−
S)
1
(
255
E
E
E
7 6⋯
0=
0
M
M
M
1 2⋯
23≠
非数値
条件
表現
されている
数値
254
E
E
E
1
≤
7 6⋯
0≤
(
1 2 23)
127 E E E SM
M
M
.
1
2
)
1
(
7 6 0⋯
⋯・
・
−
−0
E
E
E
7 6⋯
0=
0
M
M
M
1 2⋯
23≠
(
1 2 23)
126 S2
0
.
M
M
M
)
1
(
−
・
・
⋯
−0
E
E
E
7 6⋯
0=
0
M
M
M
1 2⋯
23=
(
1
)
0
S・
−
255
E
E
E
7 6⋯
0=
0
M
M
M
1 2⋯
23=
∞
・
−
S)
1
(
255
E
E
E
7 6⋯
0=
0
M
M
M
1 2⋯
23≠
非数値
参考文献
参考文献
参考文献
参考文献
浮動小数点表現については章末の演習問題の他にも自分でも幾つか問題を作って手を動かしてみて欲しい. 1)浅井宗海:コンピュータとは何か,マグロウヒル出版(1990)演習---
IEEE(“アイ・トリプル・イー”)The Institute of Electrical and Electronics Engineers,アメリカ合衆国に本部を持つ電気・ 電子技術の学会。電子通信関連の規格の制定も行っている。演習問題
演習問題
演習問題
演習問題
1)次の10 進数の32 ビット浮動小数点表現を求めよ.
① 50.5 ② -0.75 ③ 1.3
2)次のビット列は数値の32 ビット浮動小数点表現である.この数値を求めよ.
① 01000000 01100000 00000000 00000000
② 10000000 00101000 00000000 00000000
32bit形式:
S
E
7E
6⋯
⋯
E
0M
1M
2⋯
⋯
M
23表している数は
2 23 2 1 127 ) E E (E S)
M
M
(1.M
2
(-1)
7 6 0 2⋯
⋯
⋯ ⋯×
×
−---
ケ チ ケ チケ チ ケ チ 表 現表 現表 現 (表 現 economized form)±
±
±
±
1.
□
□
□
□
□
□
□
□
□
□
□
□
□
□
□
□ ・・・
・・・
・・・
・・・
□
□
□
□
×
2
□ □ □ □ S E7E6・・・
・・・
・・・
・・・
E0 ----127 M1M2M3・・・・・・・・・・・・M23記録
記録
記録
記録 しない
しない
しない(
しない
(
(
( ケチ
ケチ
ケチ
ケチ表現
表現
表現
表現 )
)
)
)
演習問題
演習問題
演習問題
演習問題 の
の
の
の 解答例
解答例
解答例
解答例
1)次の10 進数の32 ビット浮動小数点表現を求めよ.
① 50.5 ② -0.75 ③ 1.3
2)次のビット列は数値の32 ビット浮動小数点表現である.この数値を求めよ.
① 01000000 01100000 00000000 00000000
② 10000000 00101000 00000000 00000000
① 50.5 ⅰ)正の数だから、符号ビットs = 0 ⅱ)50.5 の2 進数を求め,これを (1 .□ □ □・・・)2 ×2nの形に正規化する。 50.510 = 32 + 16 + 2 + 0.5 = 110010.1 = 1.100101 ×25ⅲ)指数部E7E6E5...E0 - 127 = 5 よりE7E6E5...E0 = 132 =128 + 4 = 10000100 ⅳ)仮数部M1M2M3...M23 = 10010100000...0 ⅴ)以上から,50.5 の 32 ビット浮動小数点表現は, 01000010 01001010 00000000 00000000 ② -0.75 負の数だからs = 1 0.7510 = 0.5 + 0.25 = 0.112 = 1.12 × 2- 1 より, E7E6E5...E0 = 127 - 1 = 126 = 01111110 M1M2M3...M23 = 10000...0 となり, -0.75 の32 ビット浮動小数点表現は, 10111111 01000000 00000000 00000000 ③ 1.3 正の数だからs = 0 0.3 × 2 = 0.6 0.6 × 2 = 1.2 0.2 × 2 = 0.4 0.4 × 2 = 0.8 0.8 × 2 = 1.6 (この後は繰り返しになる) より、 1.310 = 1.0100110011001... したがって、 E7E6E5...E0 = 127 = 01111111 M1M2M3...M23 = 01001100110011001... このように循環少数になるが、仮数ビットが いっぱいになったところで打ち切る。以上より 1.3 の32 ビット浮動小数点表現は、 00111111 10100110 01100110 01100110 ① 01000000 01100000 00000000 00000000 符号ビット s = 0 だから正の数. E7E6E5...E0 = 10000000 = 128 M1M2M3...M23 = 110000000000...0 より, + 2128 - 127 × 1.112 = 2 × 1.112 = 11.12 = 3.5
表現されている実数は 3.5
② 10000000 00101000 00000000 00000000 符号ビット s = 1 だから負の数. E7E6E5...E0 = 00000000 = 0 M1M2M3...M23 = 0101000000...0 となる.表5-1 より, -2-126×0.0101 2 = - 2-128×1.012 = - 2-128×1.25 表現されている実数は -2-128×1.25 1) 2) この問題は,要注意! E7E6E5...E0 = 0, M1M2M3...M23 ≠0 なので,表 5-1の2行 目に従う。まとめと まとめとまとめと まとめと 補足補足補足補足 ◎実数の内部表現 浮動小数点形式
有限の桁で小さな値から大きな値までを表すことができる
符号(sign),指数(Exponent),仮数(Mantissa)で表現
小数点以下の10進数の2進数変換 → “乗算シフト法”2 で乗算していき,積の1 の位を並べる
小数点以下
小数点以下
小数点以下
小数点以下 の
の 桁
の
の
桁
桁 を
桁
を
を 持
を
持
持 つ
持
つ
つ
つ
10
10
10
10
進数
進数
進数
進数 を
を
を
を 有限桁
有限桁 の
有限桁
有限桁
の
の
の
2
2
2
2
進数
進数
進数
進数 に
に 誤差
に
に
誤差
誤差
誤差 ゼロ
ゼロ
ゼロ
ゼロ では
では 変換
では
では
変換
変換
変換 できないことがある
できないことがある
できないことがある
できないことがある
◎ IEEEIEEEIEEEIEEE ---- 754754754 浮動小数点形式754浮動小数点形式浮動小数点形式浮動小数点形式 PC
PC PC
PC やややや EWSEWSEWS におけるEWSにおける 実数内部表現におけるにおける実数内部表現実数内部表現実数内部表現 のののの 標準標準標準標準
32bit形式:
S
E
7E
6⋯
⋯
E
0M
1M
2⋯
⋯
M
23表している数は
(-1)
S2
(E7E6 E0)2 127(1.M
1M
2M
23)
2⋯
⋯
⋯ ⋯×
×
−ただし,
1
≤
(E
7E
6⋯
⋯
E
0)
2≤
254
注意:0は,この形では表せない(詳しくは講義メモ
p.4-3 表4-1)
補足 64bit形式:
(-1)
S2
(E10E9 E0)2 1023(1.M
1M
2M
52)
2⋯
⋯
⋯ ⋯×
×
−ただし,
1
≤
(E
10E
9⋯
⋯
E
0)
2≤
2046
1)
表現できる値に上限・下限がある
129
149
~
2
2
−
±
+
±
→
±
10
−45~
±
10
39(149/3.32≒45,129/3.32≒39)
2)
値を表現できる分解能(細かさ)が有限
32bit形式の場合,有効桁数は,23+1 =24bit
仮数ビット 隠れビット(ケチ表現)
10進数換算では,24/3.32≒7より,有効数字は7 桁
±
±
±
±
1.
□
□
□
□
□
□
□
□
□
□
□
□
□
□
□
□・・・
・・・
・・・
・・・
□
□
□
□
×
2
□ □ □ □S
E
7E
6・・・
・・・
・・・
・・・
E
0-
-
-
-
127
M
1M
2M
3・・・
・・・
・・・
・・・
M
23記録
記録
記録
記録 しない
しない
しない(
しない
(
(
(ケチ
ケチ
ケチ
ケチ表現
表現
表現
表現)
)
)
)
質問・意見(抜粋)と回答例(Q:質問,C:意見,R:要求,A:回答)
C:資料 3-5,6 が抜けています。(指摘が多数) A:やってしまいました・・・。申し訳ありません。2進数に関する演習問題と解答例が載っていたところです。次 回に持ってきます。 C:浮動小数点の計算がわからなかった。(同様のコメント多数) A:次週に,かなりしつこく,“スモールステップ”でやる予定です。楽しみにしておいてください。 Q:なぜ正規化では“5962×107 ”ではなく“0.5962×1011 ”のように表すのか? A:正規化には,同じ数値の内部表現を1つに定めるためだけでなく,仮数部の大きさを一定以内に収めるためにも 使います。“5962×10 7 ”では仮数部の桁数によって大きさが変わってきてしまいます。これに対し,“0.5962×10 11 ” では仮数は 0.1~0.9999···の範囲に収まります。“5.962×10 10 ”という正規化の方法なら,1.0~9.99···です。(Very Good) Q:表 4-1 の一番下の非数値とは,どのようなものですか?A:その名前の通り“数値でないデータ(Not a Number,NaN)”のことで,例えば,浮動小数点の演算結果を表 示するプログラムで,0で割るなどの演算で結果が不定になったときなど,表示は“NaN”となります。 Q:8bit の整数表現で表せる範囲は-128~127 ということですが,これを広げることはできますか?
A:16bit,32bit,64bit などを使うと,範囲は広くなります。しかし,有限のビット数である限りは,どこかに限 界があります。
Q:①32bit の他に,何 bit の浮動小数点表現があるのですか? ②64bit の場合,仮数は何桁ですか?
A:①64bit,128bitなどがあります。また10進数の1桁ずつを表現する方法もあります。②64bit表現では仮数は 52bitです。
Q:32bit 表現の数の上限は 254,64bit 表現の数の上限は 2046,この2 つを比べると表せる量にかなりの差があるように思うの ですが,実際に人間の感じる範囲え,どれくらいの差があるのでしょうか?
A:254や2046というのは,内部表現の指数部の値の幅だと思います。64bitは32bitより,ずっと大きい値や小さ い値を表現できます。32bitだと,せいぜい10進の7桁程度です。しかし,人間の感じる音の強さなどのダイナ ミックレンジ(一番小さな音と,最大の音の振幅の比)は,7桁よりは小さいのではないでしょうか。(Very Good) C:水の入った容器の図を使った説明を真っ先にすべきだ。 A:昔は式の説明だけで納得してくれていたのですが,あるときから,この“容器に入れた水で数値を表す”図での 説明を入れました。順番は考えてみます。 Q:2 の補数を使った加減算をするとき,(8bit 表現では)9bit への桁上げを無視するのは何故か? (この質問多数) A:これは大事なポイントなので,次回に補足説明します。数式で証明することもできます。2の補数を使うと,1 0000 0000が余計に加算されているので,これを引き算する必要があります。しかし,この余分な値を引く操作は,単 に9ビット目の1を消すことですから,“9ビット目への桁上げを無視する”と書いてあります。スライドショー に説明にあるように,“8ビットの枠内の結果だけを使う”という表現の方が良いような気もします。 Q:①整数の内部表現では,どうやって正負の判断をしているのか? ②例えば-5 と 251 を,どう区別するのか?(正負の判定 や,同じ内部表現に2 つの値が対応するのではないか,という質問多数) A:これも説明します。まず,正負は,(結果的に)左端のビットで判断できます。0なら正,1なら負です。また, 有限のビットで表しているので,表現できる数値に上限・下限があるので,同じ表現が正と負の2つの数値に対 応しているようなことにはなりません。 Q:小数点以下の桁を持つ実数を内部表現で扱うときの誤差が,計算に影響を与えることはないのか? また数学で扱う場合の 対処法などはあるのか?(実数を表した場合の誤差に関するコメント,質問が多数) A:まずは,10進の実数を誤差0で内部表現に変換できないということを,素直に驚いて欲しいと思います。この 誤差は,多くの場合,実用上は非常に小さいのですが,計算の仕方によっては影響が現れることがあります。数 値を有限のビットで表すことによる誤差については,時間があれば典型的な例を示して説明しますし,2年に進 学してからの「計算機基礎」でも学びます。また,数式処理ソフトなどでは,独自の内部表現を使うことがあり ます。(そうしないと(x/3)×3 = xにならない。)しかし,標準的な実数の内部表現は,かならず誤差があるこ とは覚えておく必要があります。 Q:①10 進数の実数で,誤差 0 で内部表現に変換できない値は,たくさんあるのでは? ②逆に2 進数で 10 進数に変換で きないものはありますか?
A:①はい。実はたくさんあります。②ないと思います。証明できると思いますが。(Very Good)
Q:①「乗算シフト法」で,なぜ変換できるのかわからない。②積の小数点より上の桁を消して乗算していくのは何故か?③10 進の 50.5 が 2 進の 110010.1 となるのはなぜか?(乗算シフト法と2 進数がわかっことによるコメント・意見が複数) A:除算シフト法は理解したものと思っていたのが油断でした。このあたりの話も,もう一度説明します。 Q:コンピュータ内部で虚数を表現するものはあるのか? A:プログラミング言語の仕様には複素型(Complex型)が定められているものもあります。その場合,複素数は, 実数部と虚数部,2つの実数のペアで表すことになります。
Q:コンピュータ内部では,演算の種類の指示も bit を使っているのですよね。じゃあ,数値と加算などの指示は,どのように区 別すr のですか? A:コンピュータが行う記号処理の手順を文字で書いたものがプログラムで,これもコンピュータ内部ではbitで表 現されます。プログラムが動作するとき,どこにデータがあり,どこからプログラムなのかは,あらかじめプロ グラムで定められています。(Very Good) Q:①説明が速いです。②毎回,前回の復習をしてもらうのは助かる。 A:①今回は,少し急いでしまったかもしれません。申し訳ありません。②講義の初めに前回の内容を繰り返す方法 を,私は“プリンプリン物語方式” 1 と呼んでいて,効果があるのはわかっているのですが,山内先生と交代する 前に,自分の受持ち範囲が終わるかどうか,心配になってきました。 昨年度 昨年度 昨年度 昨年度 までのまでのまでのまでの 質問質問質問 と質問ととと 回答回答 の回答回答のの 例の例例例 よりよりよりより C:①ビット反転の意味がわからない,②なぜ9 ビット目への桁上げを無視するのかが理解できない。 A:nビットの整数表現では,ある数値のビット反転は,この数値を2 n −1から減算することと同じです。n=8なら, 1111 1111から引くということです。ビット反転の後で1を加えれば,2 n から減算する操作を引き算回路を使わず に実現できることになります。 ②nビットの表現ではn+1ビット目への桁上げがあっても無くても無視する, ということです。これはnビットの枠内だけで計算を行えば良い,ということです。今回の講義でスライドショ ーで説明したのですが,もう一度,整理したスライドショーで説明したいと思います。 C:8 ビット整数表現の加減算で,結果が整数の表現範囲を超えるとは,どのようなことか分からない。 A:例えば8ビットだと,−128~+127までが表現できる範囲になります。加減算の2つの数値が表現範囲に入って いても,結果がはみ出す可能性があります。例えば,70 + 70の結果は140となって,範囲を超えてしまいます。 このため,実際の演算回路では結果が範囲を超えたこと(オーバーフローと呼ぶ)を検出する回路が付加されて います。オーバーフローを検出してソフト的に解決することもできます。 Q:2 進数で