二進数 負の数の表現
絶対値表示
先頭の桁が符号になる。0なら正、1なら負を表す。
符号部分と絶対値部分を分けて計算する。
補数表示
各ビットを反転したのを1の補数。1の補数に+1したものが2の補数。2の補数で負の数を表現する。計算はそのままできる。
表現可能な数値の範囲
8ビット整数の場合
絶対値表示:+127~+0,-0~-127
2の補数表示:+127~0~-128
10進数のコード
重み付きコード
10進数字を4ビットで表したもの。2進化10進コード(8-4-2-1コード binary coded decimal code:BCD code)5-2-1-1の重み付きコードだと補数表示が簡単。
パック形式:一桁数字4ビット符号は右端に4ビット
アンパック(ゾーン付き)形式:一桁ゾーン4ビット数字4ビット、符号は右端に符号4ビット数字4ビット
2進化10進コード | 5-2-1-1コード | |
---|---|---|
10進数\重み | 8421 | 5211 |
0 | 0000 | 0000 |
1 | 0001 | 0001 |
2 | 0010 | 0011 |
3 | 0011 | 0101 |
4 | 0100 | 0111 |
5 | 0101 | 1000 |
6 | 0110 | 1010 |
7 | 0111 | 1100 |
8 | 1000 | 1110 |
9 | 1001 | 1111 |
小数の表現
固定小数点方式:
数値の一定の位置に小数点を固定する方法。
浮動小数点方式:
数値 N = a×re r-1≦|a|<1
a:仮数、e:指数、r:指数eの基数。
IEEE方式:
単精度浮動小数点数(32ビット)符号部1ビット、指数部8ビット、仮数部:23ビット
倍精度浮動小数点数(64ビット)符号部1ビット、指数部11ビット、仮数部:52ビット
符号部:0を正、1を負。
仮数部:整数部分が1であるような2進小数の小数部分。
指数部:符号なし2進整数。単精度では127、倍精度では1023プラスする。
単精度の場合:(-1)符号部×2(指数部-127)×(1+仮数部)
正規化:仮数部の桁を有効に使うために仮数部の小数点第一位に0以外の数値が来るように指数を調節。正規化数を表現するのは指数部が254~1(127~-126)の範囲。
指数部が255の場合:
仮数部が0以外の場合:非数(NaN)
0の場合:符号部が0…正の無限大、符号部が1…負の無限大。
指数が0の時:非正規化数。指数部、仮数部がともに0の時は±0。
加減算
簡単な加減算
2進数n桁の数を加減算するときには、下位の桁からの桁上げ(carry)と上位の桁からの借り(borrow)を考える必要がある。
2進数1桁の加算
被加数 | 加数 | 下位桁からの桁上げ | 上位桁への桁上げ | 和 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
2進数1桁の減算
被減数 | 減数 | 下位桁からの借り | 上位桁からの借り | 差 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 0 | 0 |
1 | 1 | 1 | 1 | 1 |
絶対値表示の加減算
XとYの演算結果をZに入れる。X・Y・Zの符号部がx0・y0・z0、絶対値x・y・zとする。
加算
x0=y0の時:x+y→z、z0=x0。
x0≠y0の時x-yが
正ならばx-y→z z0=x0
負ならばy-x→z z0=y0
減算
x0≠y0の時:x+y→z、z0=x0。
x0=y0の時:x-yが
正ならばx-y→z z0=x0
負ならばy-x→z z0=-y0
補数表示の加減算
2の補数表示の数の加減算は、符号も含めて一回の演算で正しい結果が出ます。
5+(-7)
0101+1001=1110
0101
+) 1001
1110
乗算
2進数1桁の乗算
被乗数 | 乗数 | 積 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
絶対値表示の乗算
乗算を加算とシフト操作で計算する方法。 被乗数と乗数一桁のとの積を求めるごとに加え込んで、それまでの和を求め、シフトする。シフトの結果を部分積という。
1.部分積を0にする。
2.乗数を下位の桁から一桁ずつ調べ
1ならば部分積と被乗数との和を求める。
0ならば操作しない。
(2.)の結果を一桁右シフトし部分積とする。
乗数の全ての桁について上記の操作を繰り返し、部分積を結果とする。
0101 | × | 1001 | ||
0000 | 部分積0 | |||
0101 | 1001 | 0101 | 被乗数 | |
00101 | 部分積と被乗数の和・右シフト | |||
0101 | 1001 | 0000 | 操作なし | |
000101 | 右シフト | |||
0101 | 1001 | 0000 | 操作なし | |
0000101 | 右シフト | |||
0101 | 1001 | 0101 | 被乗数 | |
00101101 | 部分積と被乗数の和・右シフト |
0101
× 1001
0101
0000
0000
0101101101
補数表示の乗算
|y0|y1y2…yk-1yk…ym|
符号桁y0、数値部y1~ymm桁。ym+1に0を追加。
被乗数X、乗数Y。
1.部分積を0にする。
2.ym+1桁から始め一桁上位の隣り合う2桁を調べ次の表の操作をして、部分積を求める。シフトによって送り込まれる上位の桁には符号桁の数字を入れる。
2進数1桁の乗算
yk-1 | yk | 操作 |
---|---|---|
0 | 1 | 部分積にXを加え、1ビット右シフト |
1 | 0 | 部分積からXを引き、1ビット右シフト |
0 | 0 | 部分積を1ビット右シフト |
1 | 1 | 部分積を1ビット右シフト |
3,符号桁まで上の操作を繰り返す。ただし最後の操作でシフトは行わない。部分積が結果。
00101(5)×10111(−9)
00000 | 部分積を0にする | ||
-) | 00101 | 101110 | |
11011 | Xを引く | ||
111011 | ビットシフト・符号1を上位の桁加える | ||
1111011 | 101110 | ビットシフト・符号1を上位の桁加える | |
11111011 | 101110 | ビットシフト・符号1を上位の桁加える | |
+) | 00101 | 101110 | |
00100011 | Xを足す | ||
000100011 | ビットシフト・符号0を上位の桁加える | ||
-) | 00101 | 101110 | |
111010011 | Xを引く | ||
結果(-45) |
除算
絶対値表示の除算
被除数:2n+1(符号)桁、除数、商、剰余:n桁。
1.Xを被除数、Yを除数の絶対値とする。X-Yを求めて、正または0ならば除算不能とする。負ならば除数を加えて、初回の部分剰余とする。
2.部分剰余を1桁左シフトする。
3.2の結果から除数Yを引く。
正または0ならば部分剰余とし、qiを1とする。
負ならば除数Yを加え部分剰余としqiを0とする。
2と3をi=1,…,nまでn回繰り返す。商の絶対値はq1,q2,…,qn。剰余の絶対値は部分剰余の左半分に2-nを掛ける。商の符号は被除数、除数がどう符号のとき正、異符号のとき負。剰余の符号は被除数の符号と同一。
00001001(9) | ÷0101(5) | q1 | q2 | q3 | q4 | ||
- | 0101 | 負 | オーバーフローしない | ||||
00010010 | シフト | ||||||
- | 0101 | 負 | 0 | ||||
00100100 | シフト | ||||||
- | 0101 | 負 | 0 | 0 | |||
01001000 | シフト | ||||||
- | 0101 | 負 | 0 | 0 | 0 | ||
10010000 | シフト | ||||||
- | 0101 | 正 | 0 | 0 | 0 | 1(商) | |
01000000 | X-Y | ||||||
0100(剰余) | 2-4をかける |
補数表示の除算
被除数:2n+1桁、除数、商、剰余:n+1桁。
1.X,Yを符号も含めた被除数、除数とする。符号を比較し同符号ならX-Yを求め、異符号ならX+Yを求める。この結果を初回の部分剰余とする。被除数Xと部分剰余の符号が同符号なら除算不能。
2.部分剰余を1桁左シフトする。
3.上記の結果を除数Yの符号を調べる。
同符号ならばYを引き、部分剰余としqiを1とする。
異符号ならばYを加え、部分剰余としqiを0とする。
2と3をi=0,…,n-1までn回繰り返す。商は得られたqiに補正を加え、q0,q1,…,qn-1。剰余は部分剰余の上位n+1桁にに2-nを掛ける。商の符号q0は正しく求められているが剰余の符号は一定しない。
000001001(9) | ÷00101(5) | q0 | q1 | q2 | q3 | q4 | ||
- | 00101 | 同符号 | ||||||
110111001 | X-Y | |||||||
10111001 | シフト | |||||||
+ | 00101 | 異符号 | 0 | |||||
11100001 | X+Y | |||||||
1100001 | シフト | |||||||
+ | 00101 | 異符号 | 0 | 0 | ||||
1110101 | X+Y | |||||||
110101 | シフト | |||||||
+ | 00101 | 異符号 | 0 | 0 | 0 | |||
111111 | X+Y | |||||||
11111 | シフト | |||||||
+ | 00101 | 異符号 | 0 | 0 | 0 | 0 | ||
00100(剰余) | X+Y | |||||||
0 | 0 | 0 | 0 | 1(q4に1追加 商) |
シフト演算
算術シフト
先頭ビットを符号とみなし符号ビットを除いてシフト。左シフトでは空いた位置に0、右シフトでは空いた位置に符号ビット。
論理シフト
単純にビットを左右にシフトし空いた位置に0.
演算精度
丸め誤差
数値の特定の桁に対して四捨五入、切り捨て、切り上げを行うことで生じる誤差
打ち切り誤差
技術計算などである程度結果が収束した時点で処理を打ち切った際に生じる誤差
情報落ち
絶対値の大きい数値に絶対値の小さい数値を加減算することによって絶対値の小さい数値が無視されてしまう誤差
桁落ち
絶対値のほぼ等しい同符号の数値を減算することによって有効桁数が少なくなる誤差
オーバーフロー
演算結果が表現できる最大値を超えてしまう誤差。最小値を超えた場合はアンダーフロー
積み残し
情報落ちが繰り返し起こる場合の誤差
絶対誤差
|(近似値)−(真値)|=|(誤差)|
相対誤差
$$|\frac{(誤差)}{(真値)}|$$
精度
$$-\log_n{(相対誤差)} n:相対誤差の基数$$