close

数と表現 負の数と四則演算

二進数 負の数の表現

絶対値表示

先頭の桁が符号になる。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進数\重み84215211
000000000
100010001
200100011
300110101
401000111
501011000
601101010
701111100
810001110
910011111

小数の表現

固定小数点方式:

数値の一定の位置に小数点を固定する方法。

浮動小数点方式:

数値 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桁の加算

被加数加数下位桁からの桁上げ上位桁への桁上げ
00000
01001
10001
11010
00101
01110
10110
11111

2進数1桁の減算

被減数減数下位桁からの借り上位桁からの借り
00000
01011
10001
11000
00111
01111
10100
11111

絶対値表示の加減算

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桁の乗算

被乗数乗数
000
010
100
111

絶対値表示の乗算

乗算を加算とシフト操作で計算する方法。 被乗数と乗数一桁のとの積を求めるごとに加え込んで、それまでの和を求め、シフトする。シフトの結果を部分積という。

1.部分積を0にする。

2.乗数を下位の桁から一桁ずつ調べ
1ならば部分積と被乗数との和を求める。
0ならば操作しない。

(2.)の結果を一桁右シフトし部分積とする。

乗数の全ての桁について上記の操作を繰り返し、部分積を結果とする。

0101×1001
0000部分積0
010110010101被乗数
00101部分積と被乗数の和・右シフト
010110010000操作なし
000101右シフト
010110010000操作なし
0000101右シフト
010110010101被乗数
00101101部分積と被乗数の和・右シフト

0101
× 1001

0101

0000

0000

0101

101101

補数表示の乗算

|y0|y1y2…yk-1yk…ym|

符号桁y0、数値部y1~ymm桁。ym+1に0を追加。

被乗数X、乗数Y。

1.部分積を0にする。

2.ym+1桁から始め一桁上位の隣り合う2桁を調べ次の表の操作をして、部分積を求める。シフトによって送り込まれる上位の桁には符号桁の数字を入れる。

2進数1桁の乗算

yk-1yk操作
01部分積にXを加え、1ビット右シフト
10部分積からXを引き、1ビット右シフト
00部分積を1ビット右シフト
11部分積を1ビット右シフト

3,符号桁まで上の操作を繰り返す。ただし最後の操作でシフトは行わない。部分積が結果。

00101(5)×10111(−9)

00000部分積を0にする
-)00101101110
11011Xを引く
111011ビットシフト・符号1を上位の桁加える
1111011101110ビットシフト・符号1を上位の桁加える
11111011101110ビットシフト・符号1を上位の桁加える
+)00101101110
00100011Xを足す
000100011ビットシフト・符号0を上位の桁加える
-)00101101110
111010011Xを引く
結果(-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)q1q2q3q4
-0101オーバーフローしない
00010010シフト
-01010
00100100シフト
-010100
01001000シフト
-0101000
10010000シフト
-01010001(商)
01000000X-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)q0q1q2q3q4
-00101同符号
110111001X-Y
10111001シフト
+00101異符号0
11100001X+Y
1100001シフト
+00101異符号00
1110101X+Y
110101シフト
+00101異符号000
111111X+Y
11111シフト
+00101異符号0000
00100(剰余)X+Y
00001(q4に1追加 商)

シフト演算

算術シフト

先頭ビットを符号とみなし符号ビットを除いてシフト。左シフトでは空いた位置に0、右シフトでは空いた位置に符号ビット。

論理シフト

単純にビットを左右にシフトし空いた位置に0.

演算精度

丸め誤差

数値の特定の桁に対して四捨五入、切り捨て、切り上げを行うことで生じる誤差

打ち切り誤差

技術計算などである程度結果が収束した時点で処理を打ち切った際に生じる誤差

情報落ち

絶対値の大きい数値に絶対値の小さい数値を加減算することによって絶対値の小さい数値が無視されてしまう誤差

桁落ち

絶対値のほぼ等しい同符号の数値を減算することによって有効桁数が少なくなる誤差

オーバーフロー

演算結果が表現できる最大値を超えてしまう誤差。最小値を超えた場合はアンダーフロー

積み残し

情報落ちが繰り返し起こる場合の誤差

絶対誤差

|(近似値)−(真値)|=|(誤差)|

相対誤差

$$|\frac{(誤差)}{(真値)}|$$

精度

$$-\log_n{(相対誤差)} n:相対誤差の基数$$

科学の部屋[工学・化学]