Transcript 2 (1의 시작비트)
컴퓨터시스템구조론 제9장 컴퓨터 산술 (Computer Arithmetic) (숫자의 2진수 표현, 산술연산(덧셈,뺄셈, 곱셈, 나숫셈 등) 9.1 산술논리연산장치 (Arithmetic & Logic Unit : ALU) 중앙처리장치(CPU)의 핵심 부분 데이터에 대하여 실제적으로 산술 및 논리 연산을 수행하는 부분 (컴퓨터의 핵심부) 2진수를 저장하고 부울 논리 연산들을 처리하는 디지털 논리회로로 구성 정수(integer), 실수(real number), 부동소수점 수(floating point numbers) 처리 산술 보조프로세서(arithmetic co-processor)의 지원을 받기도 함 ALU의 입력과 출력 레지스터 : 2진수 데이터 입, 출력, 임시저장장치 제어 유니트 : ALU의 동작 및 데이터 이동 제어 플래그(Flag) : 연산결과 이상여부 표시 (오버플로우 등) 9.2 정수 표현(Integer Representation) 2진수 체계에서는 “0” 과 “1“ , “(–) 부호” 및 “소수점” 을 이용하여 수를 표현 [예] -1101.01012 = -13.312510 컴퓨터 내부는 (–)부호와 소수점 표시 불가(다른 방안) 양수 및 음수의 표현 방법 부호-크기 표현(signed-magnitude representation) 2의 보수 표현(two’s complement representation) n 1 n비트의 2진 숫자 배열 : A 2i ai i 0 부호-크기 표현 맨 좌측 비트를 부호(sign) 비트로 사용 • 0 : 양수 • 1 : 음수 [예] +18 = 00010010 -18 = 10010010 문제점 산술 연산 과정에서 부호와 크기 부분을 별도로 처리해야 한다 0에 대한 표현이 두 개(+ 0과 – 0)이다 0 검사(zero test) 불편, 수의 표현 범위 감소 거의 사용 안 함 2의 보수 표현(Twos complement) 음수 표현 방법 : 양수 표현에서 각 비트를 반전시키고 (0 → 1, 1 → 0), 1을 더한다. 최상위 비트가 부호를 표현하는 것은 동일 [예] +3 = 00000011 +2 = 00000010 +1 = 00000001 +0 = 00000000 -1 = 11111111 -2 = 11111110 -3 = 11111101 장점 0에 대한 표현이 한 가지이다 산술 연산이 용이하다 음수화가 편리하다 2의 보수 정수의 기하학적 표현 2의 보수 표현의 공식화 2진수 A가 다음과 같다면, 이를 십진수로 바꾸면… 음수표현도 가능… 2진수 : A an1 an2 an3 a3 a2 a1 a0 10진수 : A 2 n 1 n2 an 1 2 ai i i 0 값박스(value box)의 이용 비트 길이가 다른 경우의 변환 (비트 확장) 부호-크기 표현 : 단순히 부호비트를 맨 좌측으로 이동 부호비트가 0인 양수의 경우 : 부호 비트를 0으로, 나머지는 0 [예] +18 = 00010010 +18 = 00000000 00010010 (8 비트) (16 비트) 부호비트가 1인 음수의 경우 : 부호 비트를 1으로, 나머지는 0 [예] -18 = 10010010 -18 = 10000000 00010010 (8비트) (16 비트) 비트 길이가 다른 경우의 변환 (비트 확장) 2의 보수 표현 : 부호 확장(Sign Extension) 부호 비트(양수는 0, 음수는 1)를 맨 좌측으로 이동 나머지 확장비트 : 양수는 0, 음수는 1로 채움 [예] +18 = 00010010 +18 = 00000000 00010010 (8 비트) 양수인 경우 (16 비트) [예] -18 = 11101110 -18 = 11111111 11101110 (8 비트) 음수인 경우 (16 비트) 9.3 정수 산술 음수화(negation) 부호-크기 표현에서의 규칙 : 부호비트만 반전시킴 2의 보수 표현에서의 규칙 1. 각 비트를 반전시킨다 2. 결과값에 1을 더한다 [예] +18 = 00010010 비트 단위의 반전(보수) = 11101101 +1 11101110 = -18 특수한 경우 (교재 p.244 참조) 0의 보수 = 0 -128의 보수 = -128 ???? 음수 계산시 최상위 올림수는 무시 덧셈 올림수는 무시 올림수는 무시 1비트로 표현할 수 있는 범위를 초과 1비트로 표현할 수 있는 범위를 초과 (양수+양수 = 음수??) (음수+음수 = 양수??) 오버플로우 (Overflow) 덧셈 혹은 뺄셈 결과값이 한 단어로 표현할 수 있는 수의 범위를 초과한 경우. ALU는 오버플로우 발생시 그 결과를 사용하지 못하도록 알림(Flag 사용) 검출 규칙 : 모두 양수이거나 모두 음수인 두 수를 더한 결과값의 부호가 반대가 되면 오버플로우(Overflow) 임 뺄셈 : a – b = a + (-b) : b의 보수를 취한 후 더하면 됨 덧셈과 뺄셈을 위한 하드웨어 블럭 다이어그램 : A + B or A – B => A+(-B) 곱셈(Multiplication) : MQ에서 M는 피승수(Multiplicand) Q는 승 수(Multiplier) 곱셈은 덧셈과 뺄셈보다 더 복잡 부호 없는 정수의 곱셈 과정 ① 승수(multiplier)의 각 숫자(digit)에 대하여 부분 곱 (partial product)을 계산 : 승수의 비트가 0이면 부분 적도 0, 1이면 부분곱은 피승수(multiplicand)와 동일 ② 최종 결과값은 부분곱을 한 자리 수씩 왼쪽으로 이동(쉬프트)한 후, 더한다. 효율적인 방법 : 부분곱이 발생할 때만 합을 구함, 승수 비트가 1이면 “덧셈+쉬프트”, 0이면 “쉬프트”만 필요 두 n비트 2진 정수를 곱한 결과값의 길이는 2n 비트가 된다. 곱셈의 예 (11 x 13 = 143) : 부호없는 정수 1011 x 1101 1011 0000 1011 1011 10001111 피승수(Multiplicand) (10진수 :11) 승수(Multiplier) (10진수 :13) Partial products Partial products Partial products Partial products Product (10진수 : 143) 곱셈기(multiplier)의 내부 블록도 (M x Q = ?) 부호 없는 2진수 곱셈 과정의 흐름도 실행 과정의 예 (M*Q의 결과값은 A와 Q에 저장) A+M A+M A+M M x Q 를 구하고자 함 A레지스터는 결과 저장용, C는 올림수(Carry)저장 Q의 마지막 비트가 1이면 A = A+M & C, A, Q를 오른쪽으로 이어서 쉬프트함 Q의 마지막 비트가 0이면 더하는 것 없이 C, A, Q를 오른쪽으로 이어서 쉬프트만 함 2의 보수의 곱셈 앞의 계산은 부호를 따져보면 –5*-3=-113이 됨 문제 발생 : 교재 p.250-251 참조 방법 1 • 음수를 양수로 변환 • 앞의 방법으로 곱셈 수행 • 승수와 피승수의 부호가 다르면, 결과값을 음수화 방법 2 • Booth 알고리즘(Booth’s algorithm) 이용 • 양수와 음수의 어떤 조합에서도 사용 가능 • 널리 사용 쉬프트 의미 2진수에 2n을 곱하는 연산은 좌측으로 n비트 쉬프트 하는 것과 동일 00001011 * 00001011 * 00001011 * 00001011 * 21 22 23 24 = = = = 00010110 00101100 01011000 10110000 Booth 알고리즘의 흐름도 (M x Q = ?) Booth 알고리즘의 예 (M x Q 계산시, 결과는 A와 Q에 저장됨) : 7 X 3 = 21 A-M Booth 알고리즘의 예 (계속) Q0비트와 Q-1비트를 비교함 처음에는 A와 Q-1비트는 0으로 세팅됨 Q0=0, Q-1=1이면 A=A+M, 그리고 A, Q, Q-1을 이어서 우측으로 쉬프트, 단 A의 가장 왼쪽 비트는 그대로 유지함 Q0=1, Q-1=0이면 A=A-M, 그리고 A, Q, Q-1을 이어서 우측으로 쉬프트, 단 A의 가장 왼쪽 비트는 그대로 유지함 Q0, Q-1이 모두 0이거나 1이면 A, Q, Q-1을 계산 없이 우측으로 쉬프트만 한다, 단 A의 가장 왼쪽 비트는 그대로 유지함 Booth 알고리즘을 사용한 예제 -M -> A-M (1의 블록을 이용한 계산의 단축) 계산 방법(승수 Q가 양수일 때) 승수가 양수일 때 : 수열의 합을 이용 00111110 = 25 + 24 + 23 + 22 + 21 = 2(25 – 1) = 26 - 21 (2 – 1) 00011100 = 24 + 23 + 22 = 22(23 – 1) = 25 - 22 (2 – 1) 따라서 1의 블록에서는 전체 1의 개수와 시작 1을 보면 2(1의 개수+1의 시작비트) – 2(1의 시작비트) 식이 성립 (1의 블록을 이용한 계산의 단축) 계산 방법(승수 Q가 양수일 때 (계속)) M * Q에서 비트를 2배 확장한다. 승수 Q의 1의 블록을 오른쪽부터 본다. Q를 2(1의 개수+1의 시작비트) – 2(1의 시작비트) 식으로 변환한다. M에 2n을 곱하는 것은 M을 n비트 좌측 쉬프트한 것과 같다. 따라서 -M을 좌측 쉬프트하고, M을 좌측 쉬프트하면 됨 예) 0011 * 0110 = 0011*23 + (-0011)*21 이므로 00000011을 3번 좌측 쉬프트, -00000011을 1번 좌측 쉬프트 한 후 더함 (1의 블록을 이용한 계산의 단축) 계산 방법(승수 Q가 음수일 때) 승수가 음수일 때 : 수열의 합을 이용 11111000 = -27 + 26+ 25 + 24 + 23 = -27 + 23(24 – 1) = - 23 (2 – 1) 11110000 = -27 + 26+ 25 + 24 = -27 + 24(23 – 1) = - 24 (2 – 1) 따라서 음수가 있는 1의 블록에서는 오른쪽 시작 1을 보면 됨. 즉, – 2(1의 시작비트) 식이 성립 (1의 블록을 이용한 계산의 단축) 계산 방법 (승수 Q가 음수일 때 (계속)) M * Q에서 비트를 2배 확장한다. 승수 Q의 1의 블록을 오른쪽부터 본다. Q를 – 2(1의 시작비트) 식으로 변환한다. M에 -2n을 곱하는 것은 -M을 n비트 좌측 쉬프트한 것과 같다. 따라서 -M을 좌측 쉬프트하면 됨 예) 0011 * 1110 = (-0011)*21 이므로, -00000011(11111101)을 1번 좌측 쉬프트 하면 됨 나눗셈(Division) 부호 없는 정수의 나눗셈(그림 9-15) 00001101 1011 10010011 1011 001110 Partial 1011 Remainders 001111 1011 100 Divisor(M) Quotient(몫) Dividend(Q) Remainder(나머지) Q의 비트를 왼쪽부터 검사하여 M보다 큰 값이 나올 때까지 몫을 0으로 채움 큰 값이 나오면 그 비트의 상위비트를 빼서 부분 나머지수를 구함 부분 나머지수에서 다음 하위비트를 추가하여 다시 반복 부호 없는 2진 나눗셈 과정의 흐름도 나눗셈 과정(1) 교재 그림 9.16 ~ 9.17 참조 Q(피제수)/M(제수) 계산 => 계산결과 Q는 몫, A는 나머지 A와 Q에 피제수 Q를 2의보수로 2배 확장하여 대입 (예 : Q=0111인 경우 A=0000, Q=0111 Q=1001인 경우 A=1111, Q=0111 ) 나눗셈 과정(2) A, Q를 이어서 좌측으로 쉬프트 A와 M의 부호가 같으면 A – M 을 계산 A와 M의 부호가 다르면 A + M 을 계산 계산 결과가 이전 A의 부호와 다르고, A 또는 Q가 0이 아니면 A를 이전상태로 복구 계산결과가 이전 A의 부호와 같거나, A=0 이고 Q=0 이면 Q의 오른쪽 비트 Q0=1로 세트, A는 계산값으로 변경 Q의 비트 수만큼 계산을 반복 => 계산결과 Q는 몫, A는 나머지 , 단 Q와 M의 부호 다르면 몫은 Q의 반대부호(2의보수) 9.4 부동소수점 표현 (Floating-Point Representation) 고정-소수점(fixed-point) 표현 : 소수점 이하의 수를 포함하는 실수(real number)의 표현 가능. [예] 1001.1010 = 24 + 20 +2-1 + 2-3 = 9.625 표현 범위 한계 : 매우 큰 수 및 매우 작은 수 표현 불가능 부동-소수점(floating-point) 표현 : 과학적 표기(scientific notation)의 지수(exponent)를 사용하여 소수점 위치 이동 가능 표현 범위 확대 [예] 10진수에 대한 부동-소수점 표현 976,000,000,000,000 = 9.76 x 1014 0.0000000000000976 = 9.76 x 10-14 2진수의 소수표현 0.1 = 1*2-1 = 0.5 = 1 – 2-1 0.01 = 1*2-2 = 0.25 0.11 = 1*2-1 + 1*2-2 = 0.75 = 1 – 2-2 0.001 = 1*2-3 = 0.125 0.111 = 1*2-1 + 1*2-2 + 1*2-3 = 1 – 2-3 2진수의 부동소수점 표현 ± S x B± E => ± S x 2± E 단, 부호(sign) : + 혹은 – S : 가수(significand) 혹은 멘티사(mantissa) B : 기수(base) : 여기서는 2임 E : 지수(exponent) 2진 부동소수점 표현의 형식(32비트)과 예 지수값을 조정하여 첫째 비트는 무조건 1로 변환 +127 (bias = 127 = 01111111) : 실제 값에 127을 더함, 10100 => 8비트로 확장하면 실제값은 00010100 인데, 여기에 127(01111111)을 더하면, 00010100 + 01111111 = 10010011임(저장되는 값) : 이유는 -127~128의 지수값을 표현하면 이를 0~255사이로 저장하기 위해서.. 부동소수점 표현 방법과 예 가수(멘티사) : 정규화(normalized) 표현 사용 가수 필드의 첫번째 비트가 1이 되도록 지수 조정 총 24비트에서 첫 번째 0자리에는 1이 항상 있도록 지수를 조절하여야 한다. ± 1.bbbbb….bbb x 2±E [예] 110 x 23 = 0.0110 x 27 = 1.1 x 25 (정규화 표현은 이러한 표현만 가능) 결과적으로 가수 필드의 첫번째 비트가 항상 1이 되므로, 저장하지 않는다 (hidden bit). 위 [예]의 수에 대한 부동소수점 표현 (bias=127) : 0 10000100 10000000000000000000000 부동소수점 표현 방법과 예(계속) 1.10 x 25 의 부동소수점 표현방법 부호 : 양수이므로 0 지수 : 5 = 00000101이므로 여기에 127(01111111) 을 더하면 됨 , 즉 00000101 + 01111111 = 10000100 가수 : 110이므로 맨 처음 0의자리에 있는 1은 저장할 필요가 없으므로 10만 저장하면 됨 결과 부동소수점 표현 (bias=127) : (1비트 + 8비트 + 23비트 = 32비트) 0 10000100 10000000000000000000000 부동소수점 수의 표현 범위(range) 32-비트 수 의 경우 지수는 8비트이므로 -127~128 까지 가능(127더하면 0~255) 가수는 23비트이므로 23개의 0부터 23개의 1까지 가능 (처음에만 1, 나머지 23개는 모두 1인경우) 2 – 2-23 , 즉 가수가 1.11111111111111111111111 인 경우 (처음에만 1, 나머지 23개는 모두 0인경우) 1, 즉 가수가 1.00000000000000000000000 인 경우 - (2 – 2-23) x 2128 ~ - 2-127 사이의 음수들 2-127 ~ (2 – 2-23) x 2128 사이의 양수들 정확도(accuracy) 가수의 비트 수에 따른 오차(error) = LSB의 가중치(weight) [예] 23-비트 가수의 경우 : 2-23 1.2 x 10-7 표현 가능한 수의 범위 비교 (오버플로우, 언더플로우 비교 : 교재 p.260) IEEE 754 표준 부동소수점 수의 표현을 위하여 제정된 국제표준 ± 1.bbbbb….bbb x 2±E 주요 사항들 • 32-비트 / 64-비트 형식 • 지수(exponent) : 8-비트 / 11-비트, 바이어스 = 127 / 1023 • 가수(mantissa) : 23 비트 / 52 비트, hidden bit (= 1) • 표현 영역 : 10-38, 1038 / 10-308, 10308 2128 3.4 x 1038 이므로 1038까지라고 하는 것임 IEEE 754 형식들 IEEE에 관한 추가적 참고 사항들 : 표 9.3, 표 9.4 9.5 부동소수점 산술 (Floating-Point Arithmetic) +, -, x, / 계산 과정 (X = XS ⅹBXe, Y = YS ⅹBYe) 어느 한쪽의 가수를 이동시켜 지수를 통일화한다. 즉 BYe 으로 통일화한다 덧셈 : X + Y = (XS ⅹBXe-Ye + YS) ⅹBYe 뺄셈 : X - Y = (XS ⅹBXe-Ye - YS) ⅹBYe 단, Xe ≤ Ye 곱셈 : X ⅹY = (XS ⅹYS) ⅹ BXe+Ye 나눗셈 : X/Y = (XS / YS) ⅹ BXe-Ye 10진수에 대한 계산 예 : 덧셈과 뺄셈시에는 지수를 한쪽으로(예 : 103)으로 통일화한다. X = 0.3 x 102 = 30 0.03 x 103 Y = 0.2 x 103 = 200 X + Y = (0.3 x 102-3 + 0.2) x 103 = 230 X – Y = (0.3 x 102-3 - 0.2) x 103 = (-0.17) x 103 = -170 X x Y = (0.3 x 0.2) x 102+3 = 0.06 x 105 = 6000 X / Y = (0.3 / 0.2) x 102-3 = 1.5 x 10-1 = 0.15 덧셈과 뺄셈 ① 0인지 검사 ② 가수의 자리 수가 일치하도록 위치 조정(alignment) : 오차를 줄이기 위하여 작은 수를 시프트 시킨다. ③ 가수들의 더하기 혹은 빼기 ④ 결과값의 정규화(normalization) : 1.bbb..로 고침 [예] 부동소수점 덧셈 ② 지수 조정 0.110100 × 23 ===> 0.001101 × 25 + 0.111100 × 25 + 0.111100 × 25 ----------------------------------------↗ 1.001001 × 25 => ③ 더하기 ④ 정규화 1.001001 × 25 (최종 결과) 곱셈과 나눗셈 (덧셈, 뺄셈 보다 간단함) 2진수 부동소수점 곱셈 과정 ① 가수들을 곱한다. ② 지수들을 더한다. ③ 결과값을 정규화한다. [예] (0.1011 × 23) × (0.1001 × 25) ① 가수 곱하기: 1011 × 1001 = 01100011 (부호없는 정수의 곱 : 음수가 아님) ② 지수 더하기: 3 + 5 = 8 ③ 정규화: 0.01100011 × 28 = 1.100011 × 26 (결과값) 부동소수점 곱셈 과정 2진수 부동소수점 나눗셈 과정 ① 가수들을 나눈다. ② 피젯수의 지수에서 젯수의 지수를 뺀다. ③ 결과값을 정규화한다. 부동소수점 나눗셈 과정 연산 결과로 발생할 수 있는 문제점들 • 지수 오버플로우(Exponent overflow) : 양의 지수값이 최대값 초과 +∞ 혹은 - ∞로 세트 • 지수 언더플로우(Exponent underflow) : 음의 지수값이 최대값 초과 0으로 세트 • 가수 언더플로우(Significand underflow) : alignment 과정에서 가수 비트를 잃는 경우 반올림(rounding) • 가수 오버플로우(Significand overflow) : 두 가수의 덧셈 결과로 MSB에서 올림수 발생 재조정(realign-ment) 정확도 문제 보호 비트(guard bits) : 부동소수점 연산과정에서의 오차(error)를 줄이기 위하여 최하위 가수 비트의 우측에 추가되는 비트들. 실제 부동소수점 연산을 수행하는 ALU의 내부 레지스터들은 이들을 저장하기 위한 비트만큼 더 길다. [예] x – y 계산 (x = 1.000….00 x 21 , y = 1.111….11 x 20) (a) 보호 비트가 없는 경우 x = 1.000….00 x 21 - y = 0.111….11 x 21 ---------------------z = 0.000….01 x 21 = 1.000….00 x 2-22 (b) 보호 비트가 있는 경우 x = 1.000….00 0000 x 21 - y = 0.111….11 1000 x 21 ---------------------z = 0.000….00 1000 x 21 = 1.000….00 0000 x 2-23