パタヘネ学習#3 第3章のまとめと問題演習
第3章のまとめ
3.12 演習問題
3.1〜2.2
省略
3.3
16進数から2進数への変換は各桁の数を4bitの2進数で表したものを連結すれば良い
0x5ED4 = 0101 1110 1101 0100
基数が16であるメリットは2桁で1byteを表現でき、処理単位のうえで2進数のニーモニックに最適である点
3.4〜3.5
省略
3.6
与えられた二つの符合なし10進数を8ビットの2進数に変換すると以下となる
185 = 1011 1001
122 = 0111 1010
185 - 122 = 0011 1111
以上より最上位ビットの桁借りは発生しないため、オーバーフローもアンダーフローも発生しない
3.7
8ビットの符合付き2進数の最大値は10進数で27 - 1 = 127 であるから185を変換する時点でオーバーフローが発生する
3.8
やはり185を変換する時点でオーバフローが発生する
符号付きの8ビットという指定の範囲では問題として意図が不明なように思われる
3.9
8ビットの符合付き2進数の最大値は10進数で27 - 1 = 127 であるから151を変換する時点でオーバーフローが発生する
151(-105) = 1001 0111
214(-42) = 1101 0110
上記に目をつぶり、強引にこの2数を加算すると以下となる
151 + 214 = 1 0110 1101
9ビット目に桁借りが発生し、オーバーフローしていることから飽和演算結果は以下となる
1000 0000 = -128
3.10
減算につき、前問3.9の符合付き214とした値の2の補数を求める
-214(42) = 0010 1010
151(-105) - 214(-42) = 1100 0001
桁借りが発生していないことから、飽和は発生しない
結果を前述までの強引な読替えを無視して純粋な8ビットの符合付き整数として捉えると以下となる
1100 0001 = -63
3.11
前問3.9より与えられた8ビットの符合なし整数の2数を加算すると以下となる
151 + 214 = 1 0110 1101
9ビット目に桁上がりが発生し、オーバーフローしていることから飽和演算結果は以下となる
1111 1111 = 255
3.12
与えられた二つの符合なし8進数を6ビットの2進数に変換すると以下となる
062 = 110 010 (= 50)
012 = 001 010 (= 10)
処理サイクル | ステップ | 乗数 | 被乗数 | 積 |
---|---|---|---|---|
0 | 初期値 | 001 010 | 110 010 | 000 000 |
1 | 1a:0 → 演算なし | 001 010 | 110 010 | 000 000 |
1 | 2:被乗数を左へシフト | 001 010 | 110 100 | 000 000 |
1 | 3:乗数を右へシフト | 000 101 | 110 100 | 000 000 |
2 | 1a:1 → 積 = 積 + 被乗数 | 000 101 | 110 100 | 110 100 |
2 | 2:被乗数を左へシフト | 000 101 | 101 000 | 110 100 |
2 | 3:乗数を右へシフト | 000 010 | 101 000 | 110 100 |
3 | 1a:0 → 演算なし | 000 010 | 101 000 | 110 100 |
3 | 2:被乗数を左へシフト | 000 010 | 010 000 | 110 100 |
3 | 3:乗数を右へシフト | 000 001 | 010 000 | 110 100 |
4 | 1a:1 → 積 = 積 + 被乗数 | 000 001 | 010 000 | 000 100 |
4 | 2:被乗数を左へシフト | 000 001 | 100 000 | 000 100 |
4 | 3:乗数を右へシフト | 000 000 | 100 000 | 000 100 |
5 | 1a:0 → 演算なし | 000 000 | 100 000 | 000 100 |
5 | 2:被乗数を左へシフト | 000 000 | 000 000 | 000 100 |
5 | 3:乗数を右へシフト | 000 000 | 000 000 | 000 100 |
6 | 1a:0 → 演算なし | 000 000 | 000 000 | 000 100 |
6 | 2:被乗数を左へシフト | 000 000 | 000 000 | 000 100 |
6 | 3:乗数を右へシフト | 000 000 | 000 000 | 000 100 |
7 | 1a:0 → 演算なし | 000 000 | 000 000 | 000 100 |
7 | 2:被乗数を左へシフト | 000 000 | 000 000 | 000 100 |
7 | 3:乗数を右へシフト | 000 000 | 000 000 | 000 100 |
8 | 1a:0 → 演算なし | 000 000 | 000 000 | 000 100 |
8 | 2:被乗数を左へシフト | 000 000 | 000 000 | 000 100 |
8 | 3:乗数を右へシフト | 000 000 | 000 000 | 000 100 |
処理サイクル 1のステップ 2:被乗数を左シフトする時点でオーバーフローが発生する
よって設問として答えを6ビットで表現しようというのなら、オーバーフローが発生し、正しい答えを成さない
3.13
省略
3.14
判定処理を除くと、乗算を行うのに必要なステップは以下の3つとなる
また、整数の長さが8ビットであることから積レジスタの最大長を8ビットと解釈仮定すると、乗数レジスタの最大長は4ビットとなる
よって本問の解答にあたり、乗算ループの回数は4回と仮定する
乗算処理をハードウェアで行う場合、被乗数と乗数のシフトを同時に実行できることから1回の乗算ループで必要なステップ数は2回となり、乗算を行うのに必要な時間は以下となる
2(ステップ) × 4(単位時間) × 4(ループ回数) = 32単位時間
乗算処理をソフトウェアで行う場合、被乗数と乗数のシフトを順に実行しなければならないことから1回の乗算ループで必要なステップ数は3回となり、乗算を行うのに必要な時間は以下となる
3(ステップ) × 4(単位時間) × 4(ループ回数) = 48単位時間
3.15
省略
3.16
整数の長さが8ビットであることから積レジスタの最大長を8ビットと解釈仮定すると、乗数レジスタと被乗数レジスタの最大長は4ビットなる
図3.7に示されている方法より、処理にかかる時間は2を底とした乗数レジスタ(=被乗数レジスタ)長の対数であることから乗算を行うのに必要な時間は以下となる
× 4(単位時間) = 8単位時間
3.17
与えられた二つの符合なし16進整数を10進数に変換すると以下となる
0x33 = 51 = 32 + 16 + 2 + 1 = 25 + 24 + 21 + 1
0x55 = 85 = 64 + 16 + 4 + 1 = 26 + 24 + 22 + 1
シフト回数を鑑みると以下の展開が最適となる
51 × 85 = (2 × 2 × 2 × 2 × 2 + 2 × 2 × 2 × 2 + 2 + 1) × 85
85を左に5回シフトした結果と85を左に4回シフトした結果と85を左に1回シフトした結果と1をすべて加算することにより計算する
3.18
問題文にある入力データとは被除数と除数を指すものと思われる
であれば、与えられた被除数と除数はそれぞれ10進数の74と21であり、74については6ビットの符号なし整数で表現することはできない
よって設問として不備があると判断する
以下、入力データはキリの良さをを考慮して8ビットの符号なし整数として与えられたものとする
その際、被除数・除数はシフトする都合上、レジスタは16ビット長を想定する
74 = 0100 1010
21 = 0001 0101
処理サイクル | ステップ | 商 | 除数 | 剰余 |
---|---|---|---|---|
0 | 初期値 | 0000 0000 | 0001 0101 0000 0000 | 0000 0000 0100 1010 |
1 | 1:剰余 = 剰余 - 除数 | 0000 0000 | 0001 0101 0000 0000 | 1110 1011 0100 1010 |
1 | 2b:剰余 < 0 → 剰余を戻し、商を左シフト、商 0 = 0 | 0000 0000 | 0001 0101 0000 0000 | 0000 0000 0100 1010 |
1 | 3:除数を右へシフト | 0000 0000 | 0000 1010 1000 0000 | 0000 0000 0100 1010 |
2 | 1:剰余 = 剰余 - 除数 | 0000 0000 | 0000 1010 1000 0000 | 1111 0101 1100 1010 |
2 | 2b:剰余 < 0 → 剰余を戻し、商を左シフト、商 0 = 0 | 0000 0000 | 0000 1010 1000 0000 | 0000 0000 0100 1010 |
2 | 3:除数を右へシフト | 0000 0000 | 0000 0101 0100 0000 | 0000 0000 0100 1010 |
3 | 1:剰余 = 剰余 - 除数 | 0000 0000 | 0000 0101 0100 0000 | 1111 1011 0000 1010 |
3 | 2b:剰余 < 0 → 剰余を戻し、商を左シフト、商 0 = 0 | 0000 0000 | 0000 0101 0100 0000 | 0000 0000 0100 1010 |
3 | 3:除数を右へシフト | 0000 0000 | 0000 0010 1010 0000 | 0000 0000 0100 1010 |
4 | 1:剰余 = 剰余 - 除数 | 0000 0000 | 0000 0010 1010 0000 | 1111 1101 1010 1010 |
4 | 2b:剰余 < 0 → 剰余を戻し、商を左シフト、商 0 = 0 | 0000 0000 | 0000 0010 1010 0000 | 0000 0000 0100 1010 |
4 | 3:除数を右へシフト | 0000 0000 | 0000 0001 0101 0000 | 0000 0000 0100 1010 |
5 | 1:剰余 = 剰余 - 除数 | 0000 0000 | 0000 0001 0101 0000 | 1111 1110 1100 1010 |
5 | 2b:剰余 < 0 → 剰余を戻し、商を左シフト、商 0 = 0 | 0000 0000 | 0000 0001 0101 0000 | 0000 0000 0100 1010 |
5 | 3:除数を右へシフト | 0000 0000 | 0000 0000 1010 1000 | 0000 0000 0100 1010 |
6 | 1:剰余 = 剰余 - 除数 | 0000 0000 | 0000 0000 1010 1000 | 1111 1111 1010 0011 |
6 | 2b:剰余 < 0 → 剰余を戻し、商を左シフト、商 0 = 0 | 0000 0000 | 00000 0000 1010 1000 | 0000 0000 0100 1010 |
6 | 3:除数を右へシフト | 0000 0000 | 0000 0000 0101 0100 | 0000 0000 0100 1010 |
7 | 1:剰余 = 剰余 - 除数 | 0000 0000 | 0000 0000 0101 0100 | 1111 1111 1111 0110 |
7 | 2b:剰余 < 0 → 剰余を戻し、商を左シフト、商 0 = 0 | 0000 0000 | 0000 0000 0101 0100 | 0000 0000 0100 1010 |
7 | 3:除数を右へシフト | 0000 0000 | 0000 0000 0010 1010 | 0000 0000 0100 1010 |
8 | 1:剰余 = 剰余 - 除数 | 0000 0000 | 0000 0000 0010 1010 | 0000 0000 0010 0000 |
8 | 2a:剰余 >= 0 → 商を左シフト、商 0 = 1 | 0000 0001 | 0000 0000 0010 1010 | 0000 0000 0010 0000 |
8 | 3:除数を右へシフト | 0000 0001 | 0000 0000 0001 0101 | 0000 0000 0010 0000 |
9 | 1:剰余 = 剰余 - 除数 | 0000 0001 | 0000 0000 0001 0101 | 0000 0000 0000 1011 |
9 | 2a:剰余 >= 0 → 商を左シフト、商 0 = 1 | 0000 0011 | 0000 0000 0001 0101 | 0000 0000 0000 1011 |
9 | 3:除数を右へシフト | 0000 0011 | 0000 0000 0000 1010 | 0000 0000 0000 1011 |
以上より、結果は以下となる
商 = 0000 0011 = 3
剰余 = 0000 0000 0000 1011 = 11
3.19〜3.22
省略
3.23
与えられた10進小数を2進小数にすると以下となる
63.25 = 111111.01
正規化すると以下となる
1.1111101 × 2-5
単精度の場合の浮動小数点の一般形式に当てはめると以下となる
(-1)0 × (1 + .1111 1010 0000 0000 0000 000) × 2122 - 127
よって63.25を単精度の浮動小数点形式で表現すると以下となる
0 01111010 1111 1010 0000 0000 0000 000
3.24
前問 3.23の解答を途中から引継ぐき63.25を倍精度の浮動小数点の一般形式に当てはめると以下となる
(-1)0 × (1 + .1111 1010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000) × 21018 - 1023
よって63.25を倍精度の浮動小数点形式で表現すると以下となる
0 01111111010 1111 1010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
3.25〜3.41
省略
3.42
以下、単精度の浮動小数点形式にて回答する
- 1/4 = 1 01111101 0000 0000 0000 0000 0000 000
よって正確に表すことができる
3.43
以下、単精度の浮動小数点形式にて回答する
- 1/4を4回加算した答えは仮数の指数調整となり、以下となる
1 00000000 0000 0000 0000 0000 = -1
(- 1/4) × 4の答えについて単精度の浮動小数点数同士の積であるとして、4を単精度の浮動小数点形式で表現すると以下となる
4 = 0 10000011 0000 0000 0000 0000 0000 000
答えは指数の加算(ゲタ履き)を考慮し、以下となる
(- 1/4の指数部):01111101 + (4の指数部):10000011 + = 00000000
1 00000000 0000 0000 0000 0000 = -1
3.44~3.47
省略
第3章の課題
2~16の基数の計算を繰り返すことで、桁の重みや補数について感覚的にわかるようになったが、浮動小数点の精度については実装においてどこまで数値として、また表示として信頼できるのか、どんなときに使うべきなのか改めて整理しておきたい
設問が不明瞭だったので勝手に仮定したが、正しいかったのか確証が持てないのでもう少し知識もとい常識を得てから振り返りたい