03장 컴퓨터 산술과 논리 연산

Jun-hee Cho·2022년 12월 30일
0

Computer Architecture

목록 보기
4/9

산술논리연산장치(ALU) : CPU 내부의 핵심 구성요소로서, 산술 연산과 논리 연산을 수행하는 하드웨어 모듈

3.1 ALU의 구성 요소

• 산술연산장치 : 산술 연산(+, -, ×, ÷)을 수행
• 논리연산장치 : 논리 연산들(AND, OR, XOR, NOT 연산 등)을 수행
• 시프트 레지스터 : 비트들을 좌측 혹은 우측으로 이동시키는 기능을 가진 레지스터
• 보수기 : 데이터에 대하여 2의 보수를 취함
• 상태 레지스터 : 연산 결과의 상태를 나타내는 플래그들을 저장하는 레지스터

3.2 정수의 표현

2진수 체계 : 어떤 수를 0과 1, 부호 및 소수점으로 표현
변환 방법

2진 소수점 : 2진수 표현에서의 소수점으로서, 자릿수가 1보다 더 큰수와 더 작은 수의 경계점
변환 방법

자릿수 : 수 표현에 사용된 2진 비트들의 위치에 따른 10진값으로서, 가중치라고도 함
부호 비트 : 수가 양수인지 혹은 음수인지를 나타내는 비트로서 2진수의 맨 좌측 비트가 사용되며, 0은 양수, 1은 음수를 나타냄
부호 비트를 사용하는 2진수 표현
• 부호화-크기 표현
• 1의 보수 표현
• 2의 보수 표현

3.2.1 부호화-크기 표현

수를 표현하는 단어의 비트 수가 n이라면, 맨 좌측 비트가 부호 비트이고, 나머지 (n - 1)개의 비트들은 수의 크기를 나타냄

결점
첫 번째, 덧셈과 뺄셈을 수행하기 위해서는 부호 비트와 크기 부분을 별도로 처리해야 함
ex)두 수의 크기를 비교 -> 부호가 같은 경우에는 크기 부분들을 더하고, 다른 경우에는 크기 부분의 차이를 구함 -> 크기 부분의 절대값이 더 큰 수의 부호를 결과값의 부호로 세트
두 번째, 0에 대한 표현이 두 개 존재

-> n-비트 2진수로 표현할 수 있는 수들이 2의 n승개가 아니라 (2의 n승 - 1)개로 줄어듦

3.2.2 보수 표현

보수 표현 : 음수를 2진수로 표현하는 방법으로서, 1의 보수 및 2의 보수 표현이 있음
• 1의 보수 표현 : 모든 비트들을 반전(0 -> 1, 1 -> 0)
• 2의 보수 표현 : 모든 비트들을 반전하고, 결과값에 1을 더함

2의 보수 표현을 이용하여 n-비트 2진수로 표현할 수 있는 양수의 범위는 0부터 (2의 n-1승 - 1)까지이고, 음수는 -1부터 -2의 n-1승까지임.

8-비트 2진수로 표현할 수 있는 10진수의 범위

2의 보수로 표현된 양수를 10진수로 변환하는 방법

2의 보수로 표현된 음수를 10진수로 변환하는 방법

3.2.3 부호-비트 확장

부호-비트 확장 : 2의 보수를 더 긴 단어로 확장할 때 부호 비트를 상위 비트들로 복제하는 동작
데이터를 더 많은 비트의 레지스터에 저장하거나, 더 긴 데이터와 연산을 수행하기 위해 필요

2의 보수 표현의 경우 : 확장되는 상위 비트들을 부호 비트와 같은 값으로 세트

3.3 논리 연산

기본적인 논리 연산들


그림에서 입력 비트들은 일단 모든 게이트들을 통과하여 각 논리 연산의 출력을 발생함. 그리고 두 개의 선택 신호들에 의해 선택된 연산의 출력만 4 x 1 멀티플렉서의 출력으로 나가게 됨.

4-비트 논리 연산장치

각 논리 모듈로는 두 단어에서 같은 위치에 있는 비트들이 입력되며, 연산 선택 신호인 S1과 S2는 모든 모듈들에 공통에 인가됨. 논리 연산에서는 대응되는 비트들 간에 독립적으로 연산이 수행되므로, 모듈간의 데이터 전송 통로는 필요하지 않음.

1) AND 연산
두 데이터에서 같은 위치에 있는 비트들 간에 AND 연산을 수행. 즉, 두 비트들이 모두 1인경우에는 결과 데이터의 해당 비트가 1이 되고, 어느 하나라도 0이면 그 비트는 0이 됨.

2) OR 연산
두 개의 데이터에서 같은 위치에 있는 비트들 간에 OR 연산을 수행. 즉, 두 비트들 중의 어느 하나만 1이면 결과 데이터의 해당 비트가 1이 되고, 두 비트들이 모두 0이면 그 비트는 0이 됨.

3) XOR 연산
두 개의 데이터에서 같은 위치에 있는 비트들 간에 exclusive-OR연산을 수행. 즉, 두 비트들이 서로 다른 값을 가지면 해당 비트가 1이 되고, 같은 값을 가지면 그 비트는 0이 됨.

4) NOT 연산
이 연산을 수행하면 데이터 단어의 모든 비트들이 반전됨. 즉, 비트의 값이 1이면 0으로, 0이면 1로 바뀜.

5) 선택적-세트 연산
데이터의 특정 비트들을 1로 세트해주기 위한 동작으로서, 데이터가 저장된 A레지스터와 세트될 비트들의 위치를 지정해주는 B레지스터 간에 OR 연산을 수행하면 됨

6) 선택적-보수 연산
데이터 내 특정 비트들의 값을 보수화하기 위한 동작으로서, 데이터가 저장된 A레지스터와 반전시킬 비트들의 위치를 지정해주는 B레지스터 간에 XOR 연산을 수행하면 됨.

7) 마스크 연산
데이터 내 특정 비트들의 값을 0으로 리셋 시키기 위한 동작으로서, 데이터가 저장된 A레지스터와 리셋 될 비트들의 위치를 지정해주는 B레지스터 간에 AND 연산을 수행하면 됨.

8) 삽입 연산
데이터 내의 일부 비트들을 새로운 값들로 대체시키기 위한 동작으로서, 두 단계로 이루어짐. 첫 번째 단계에서는 삽입하고자 하는 비트들에 대하여 마스크 연산을 수행하여, 그들을 모두 0으로 리셋 시킴. 두 번째 단계에서는 새로이 삽입할 비트들과 그 결과 데이터 간에 OR 연산을 수행함.

9) 비교 연산
A와 B레지스터의 내용을 비교하고, 만약 두 레지스터에서 대응되는 비트들의 값이 같으면, A레지스터의 해당 비트를 0으로 세트. 그러나 만약 서로 다르다면, A레지스터의 해당 위치의 비트를 1로 세트. 비교 연산은 두 레지스터들 간에 XOR 연산을 수행함으로써 구현.

3.4 시프트 연산

1) 논리적 시프트
레지스터 내의 데이터 비트들을 왼쪽 혹은 오른쪽으로 한 칸씩 이동시키는 것

좌측 시프트 : 모든 비트들을 좌측으로 한 칸씩 이동, 최하위 비트(A1)로는 '0'이 들어오고, 최상위 비트(A4)는 버림

우측 시프트 : 모든 비트들이 우측으로 한 칸씩 이동, 최상위 비트(A4)로는 '0'이 들어오고, 최하위 비트(A0)는 버림

시프트 레지스터 : 데이터 비트들을 좌측 혹은 우측 방향으로 이동시키는 기능을 가지고 있는 레지스터

좌측 시프트를 원하는 경우에는 제어 신호L을 1로세트하면, 그 신호가 접속된 AND 게이트들의 한쪽 입력이 1로 세트되어서, 각 플립-플롭은 우측 플립-플롭의 출력을 D 입력으로 받을 수 있게 됨. 맨우측 AND 게이트로는 0이 입력됨. 입력되는 값들은 클록 신호가 들어오는 순간에 각 플립-플롭에 저장됨. 우측-시프트의 경우에는 제어 신호 R을 1로 세트하면, 각 D 플립-플롭이 좌측 플립-플롭의 출력을 입력으로 받게 됨. 그리고 맨좌측 AND 게이트로는 0이 입력됨.

2) 순환 시프트
회전이라고도 부르며, 최상위 혹은 최하위에 있는 비트를 버리지 않고 반대편 끝에 있는 비트 위치로 이동

순환 좌측-시프트 : 최상위 비트인 A4가 최하위 비트 위치인 A1으로 이동

순환 우측-시프트

직렬 데이터 전송 : 시프트 연산을 데이터 비트 수만큼 연속적으로 수행함으로써 두 레지스터들 사이에 한 개의 선을 통하여 전체 데이터를 이동하는 동작

이와 같은 직렬 전송에서는 각 클록 주기마다 한 번씩의 시프트 연산이 일어남. 따라서 4-비트 레지스터들 간의 직렬 전송을 위해서는 A레지스터에서 네 번의 순환 시프트가 연속적으로 수행되고, B레지스터에서는 네 번의 논리적 시프트가 수행되어야 함.

3) 산술적 시프트
레지스터에 저장된 데이터가 부호를 가진 정수인 경우에 부호 비트를 고려하여 수행되는 시프트. 이 연산에서 중요한 것은 시프트 과정에서 부호 비트는 그대로 두고, 수의 크기를 나타내는 비트들만 시프트 시킨다는 점임.

4) C플래그를 포함한 시프트 연산
C플래그를 포함한 좌측-시프트 : 최상위 비트인 A4가 버려지지 않고 C플래그로 이동
C플래그를 포함한 우측-시프트 : C플래그의 값이 A4로 이동하고, 다른 비트들은 모두 우측으로 한 칸씩 이동. 이 경우에 최하위 비트인 A1은 버림.

RLC : C플래그를 포함하는 좌측 순환 시프트 연산
RRC : C플래그를 포함하는 우측 순환 시프트 연산

3.5 정수의 산술 연산

기본적인 산술 연산들

3.5.1 덧셈

2의 보수로 표현된 수들 간의 덧셈 방법은 먼저 두 수를 더하고, 만약 올림수가 발생하면 버리면 됨.

병렬 가산기 : 여러 비트들로 이루어진 두 개의 데이터에 대한 덧셈을 수행하는 회로로서, 비트 수만큼의 전가산기들로 구성

4-비트 데이터(A4A3A2A1)과 (B4B3B2B1)을 더하여 합(S4S3S2S1)을 출력하는 병렬 가산기와 주변 회로들을 보여주고 있음. 그림에서 점선으로 표시된 부분이 병렬 가산기이며, 그 외는 덧셈 결과에 따라 상태 레지스터에 포함된 플래그들을 세트해주는 회로들임. 먼저, 합의 최상위 비트는 부호 비트이므로 부호(S) 플래그로 직접 연결됨. 따라서 양수이면 S 플래그가 0으로, 음수이면 1로 세트됨. 덧셈 결과에 대한 올림수(C) 플래그는 최상위 단계의 전가산기로부터 발생하는 올림수(C4)에 의해 세트됨. 또한 합의 모든 비트들을 NOR 게이트를 통과시켜서, 영(zero)을 나타내는 Z 플래그를 세트함. 즉, 합의 모든 비트들이 0이면, Z 플래그가 1로 세트됨.

오버플로우 : 2의 보수들 간의 덧셈 결과값이 표현 범위를 초과하는 경우에 발생하는 오류
검출 방법

3.5.2 뺄셈

덧셈을 이용하여 수행. 즉, A(피감수)로부터 B(감수)를 빼려면, B를 음수화 한 다음에 A와 더하면 됨.

덧셈과 뺄셈 겸용 회로의 블록 구성도

덧셈과 뺄셈에 겸용으로 사용될 수 있는 회로도의 구성도를 보여주고 있음. 이 회로에서 A레지스터로부터 들어오는 수는 보수기를 통하여 병렬 가산기로 들어옴. 그리고 병렬 가산기는 모든 회로를 포함하고 있음.

보수기 : 입력 데이터에 대하여 보수 연산을 수행하는 회로 모듈

보수기로는 제어 신호가 가해지는데, 덧셈인 경우에는 그 신호가 '0'이 되어 입력 데이터 B를 그대로 통과시킴. 뺄셈인 경우에는 제어 신호로 '1'이 가해져서 B가 보수기에 의해 2의 보수로 변환된 다음에 병렬 가산기로 입력. 덧셈 결과는 일반적으로 다른 레지스터가 아닌, 두 레지스터들 중의 어느 하나에 저장됨.

뺄셈 과정에서도 발생하는 오버플로우도 덧셈에서와 같은 검출회로를 이용하여 검출할 수 있음.

3.5.3 곱셈

각 비트에 대하여 부분 적계산 -> 부분 적들을 모두 더하여 최종 결과를 얻음

이 곱셈기의 중심에는 병렬 가산기가 위치하고, 그 입력들은 피승수가 저장되어 있는 M레지스터와 A레지스터로부터 들어옴. 그리고 가산기의 출력은 다시 A레지스터에 저장됨. 이때 덧셈 과정에서 발생한 올림수는 하나의 플립-플롭으로 구현되는 C플래그에 저장됨. 그림의 회로에서 보는 바와 같이 C 플래그와 A레지스터 및 Q레지스터는 모두 직렬(C-A-Q)로 연결되어서, 전체적으로 시프트 연산을 수행할 수 있도록 구성됨.

곱셈 과정은 승수의 최하위 비트부터 시작하여 한 비트씩 차례대로 검사하면서 수행됨. 검사 동작을 위하여, Q레지스터에 저장된 승수의 최하위 비트인 Q0비트가 제어 회로로 입력됨. 그러면 제어 회로는 Q0비트를 검사하고, 그 결과에 따라 적절한 제어 신호들을 발생함으로써 덧셈과 시프트를 수행하거나, 혹은 시프트만 시킴. 그런 다음에 C-A-Q 레지스터의 모든 비트들을 한 비트씩 우측으로 시프트 시키면, 클록의 한 사이클 동안에 수행되는 모든 동작이 완료됨. 이러한 사이클 동작이 승수의 비트 수만큼 반복되면서, 곱셈 연산이 순차적으로 수행됨.

2의 보수들 간의 곱셈은 상당히 복잡하기 때문에 특별한 알고리즘이 개발되어 있음.
Booth 알고리즘을 사용함

제어 회로는 승수의 비트들을 검사할 때, Q0뿐만 아니라 그 우측 비트(Q-1)도 함께 검사함. 즉, 제어 회로는 Q0와 Q-1을 동시에 입력하여 검사함. Q-1은 처음에는 '0'이지만, 한 단계가 끝나면 한 비트씩 우측으로 시프트 되므로 이전 단계의 Q0가 Q-1로 이동함. 그림에서 보는 바와 같이, 만약 그 두비트들의 값이 서로 같으면, 단순히 A, Q 및 Q-1레지스터들의 모든 비트들을 우측으로 한 비트씩 시프트함. 그러나 만약 그 두 비트들이 서로 다른 값을 가지고 있다면, 다음과 같은 연산들이 수행됨. '01'일 경우는 피승수를 A레지스터에 더하고, '10'일 경우에는 A로부터 피승수를 뺌. 그런 다음에는 A, Q 및 Q-1레지스터들에 대하여 한 비트씩 산술적 우측-시프트를 수행함.

이러한 과정은 승수의 비트 수 만큼인 n번 반복됨. 이를 위하여 초기화 단계에서 계수 값을 n으로 세트하고, 각 승수 비트에 대한 연산이 종료되면 계수 값을 1씩 감소시킴.

3.5.4 나눗셈


A : 피제수, B : 제수, q : 볷, r : 나머지 수

피제수의 비트들을 좌측에서부터 우측으로 차례대로 검사하여, 그 비트들이 나타내는 값이 제수보다 같거나 큰 경우가 될 때까지 한 비트씩 이동하면서 검사를 반복함. 그렇게 될 때까지 몫으로는 좌에서 우로 가면서 '0'을 채움. 나눌 수 있게 되면, 몫의 해당 비트를 '1'로 쓰고, 부분 피제수의 값에서 제수를 뺌. 그 결과를 부분 나머지 수라함.

각 사이클에서 피제수로부터의 한 비트씩이 부분 나머지 수에 추가되며, 그 결과값이 제수와 같거나 커질 때까지 그 과정이 반복됨. 그리고 새로운 부분 나머지 수를 얻기 위하여, 그 수로부터 제수를 뺌. 이 과정은 피제수의 모든 비트들에 대하여 적용될 때까지 계속됨.

제수는 M레지스터에, 피제수는 Q레지스터에 각각 저장함. 각 단계에서 A와 Q레지스터 모두 왼쪽으로 한 비트씩 시프트 됨. A가 부분 나머지 수를 나눌 수 있는지 알기 위하여 A로부터 M을 뺌. 만약 나눌 수 있는 경우에는, Q0는 1의 값을 가짐. 그렇지 않은 경우에는 Q0는 0이 되고, A의 이전 값을 복구시키기 위하여 M을 A에 다시 더함. 이 과정이 끝나면 계수 값에서 1을 뺌. 이와 같은 과정을 n번 반복하면, 최종적으로 몫은 Q레지스터에, 나머지 값은 A레지스터에 남게 됨.

2의 보수 나눗셈 방법

3.6 부동소수점 수의 표현

부동소수점 표현 : 지수를 이용하여 소수점의 위치를 이동시킬 수 있는 수 표현 방법
-> 매우 큰 수나 매우 작은 수도 간결하게 표현할 수 있음
부동소수점 수 : 부동소수점 표현으로 표현된 수

S : 부호, M : 가수, B : 기수, E : 지수
2진 부동소수점 수 : 부동소수점 표현 방식을 적용하여 표현된 2진수

32-비트 부동소수점 형식의 예

전형적인 32-비트 부동소수점 수의 형식을 보여주고 있음. 이 형식은 1-비트 부호, 8-비트 지수 필드, 그리고 23-비트 가수 필드로 구성

이러한 형식에서 가수는 정밀도를 결정해주고, 지수는 표현 가능한 수의 범위를 결정함. 즉, 가수 필드의 비트 수가 많아질수록 수를 더 정확하게 표현할 수 있으며, 지수 필드의 비트 수가 많아지면 |2의 E승|의 최댓값의 커지므로 표현할 수 있는 범위가 증가하게 됨. 그러나 데이터 길이가 고정된 상태에서 어느 한 필드의 비트 수를 증가시키면 다른 필드의 비트수가 감소하므로, 적절히 조정하는 것이 필요함.

이 형식에서 지수가 2의 보수로 표현된다면, 그 범위는 -2의 7승 ~ (2의 7승 - 1)이 됨. 가수 필드의 맨좌측 비트의 왼쪽에 소수점이 있다고 가정한다면, 23-비트 가수로는 소수점 아래 23번째 자리 수(2의 -23승)까지 표현할 수 있음. 만약 지수 필드의 길이를 한 비트 증가시킨다면, 지수의 범위는 두 배인 -2의 8승 ~ (2의 8승 - 1)로 확장됨. 그러나 가수 필드는 한 비트가 줄어들기 때문에 소수점 아래 22번째 자리 수(2의 -22승)까지만 표현할 수 있게 되어, 정밀도가 그만큼 떨어짐

단일-정밀도 수 : 32비트로 표현된 부동소수점 수
복수-정밀도 수 : 64비트로 표현된 부동소수점 수

정규화된 표현 : 소수점 우측의 첫 번째 비트가 1이 되도록 지수를 조정하여 표현한 부동소수점 수

b는 임의의 값을 가진 비트를 의미
-> 정규화된 표현은 0.1101 x 2의 5승

0.1101 x 2의 5승 표현


소수점 아래 첫 번째 비트는 항상 1이므로, 반드시 저장할 필요는 없음
-> 23-비트 가수 필드를 이용하여 소수점 아래 24번째 비트까지 저장

바이어스된 수 : 특정값을 더하여 표현된 2진수
사용 목적
• 지수 비트 패턴을 8-비트 정수로 취급할 수 있어서, 부동소수점 수 들 간의 크기 비교가 용이
• 0(혹은 0에 매우 가까운 값)에 대한 표현에서 모든 비트들이 0이 됨으로써, 0-검사(zero-test)가 용이

부동소수점 수의 표현 범위

32-비트 데이터 형식으로 표현 가능한 수의 범위

IEEE 754 표준 부동소수점 수의 형식 : 부동소수점 수의 표현 방식의 통일을 위하여 미국전기전자공학회(IEEE)에서 정의한 표준

32-비트 단일-정밀도 형식
지수가 8비트이므로, 부호 비트를 제외하면 23비트가 가수를 표현하는 데 사용될 수 있음. 가수는 부호 비트와 함께 부호화-크기 표현으로 나타냄. 이 형식에서도 가수가 정규화 된 형태를 가지며, 첫 번째 '1'은 저장하지 않음. 그런데 앞에서 설명한 것과는 달리 IEEE 표준에서는 가수가 1.M x 2의 E승의 형태를 가짐. 여기서 소수점 위의 1은 저장하지 않고(이 비트를 숨겨진 비트라고 부름), 소수점 아래의 M부분만 가수 필드에 실제로 저장됨. 지수 필드는 바이어스된 2진수로 표현되며, 바이어스 값은 127임. 따라서 지수 필드에 들어갈 비트 패턴은 지수에 127(01111111)을 더하면 됨.

64-비트 복수-정밀도 부동소수점 형식
지수가 11비트이고 가수는 52비트이므로, 그 형식으로 표현된 2진수에 대한 10진수는 식을 이용하여 변환할 수 있음.

IEEE 표준에서는 부동소수점 산술 과정에서 나타날 수 있는 몇 가지 특수한 경우에 대한 정의들도 포함하고 있음. 만약 산술 계산 결과가 이 형식으로 나타낼 수 없는 경우에 해당한다면, NaN(not a number)이라고 불리는 특수 코드로 표현됨. NaN결과를 가져올 수 있는 연산의 예로는 0으로 나누기, 음수에 대한 루트 계산 등과 같은 중요한 계산 오류들이 있음. 이 표준에서 정의하고 있는 NaN형식은 M != 0이고 E = 255 혹은 E = 2047임. 즉, 가수 필드에는 0이 아닌 값이 저장되고, 지수 필드의 모든 비트들은 1로 세트됨.

오버플로우가 발생한 경우에는 그 결과를 무한대로 취급하며, M = 0 및 E = 255 혹은 E = 2047로 나타냄. 즉, 가수 필드의 모든 비트들은 0으로, 지수 필드는 모두 1로 세트함. 반면에 언더플로우가 발생하면, 그 결과가 0은 아니지만 정규화 형태로는 표현할 수 없을 정도로 작은 수라고 볼 수 있음. 이 경우에는 지수 필드의 모든 비트들을 0으로 세트하고, 가수는 비정규화된 형태로서 0.M. 즉 소수점의 좌측 비트로서 0을 사용하여 수를 표현할 수 있도록 허용함

이 형식에서 '0'에 대한 표현은 지수 및 가수 필드의 모든 비트들을 0으로 세트하고, 부호 비트는 0 혹은 1로 세트함. 따라서 비정규화된 형태를 이용하여 극히 작은 수를 표현하면, 그 비트 패턴을 '0'에 대한 표현과 거의 같아지게 됨.

32-비트 데이터 형식

64-비트 데이터 형식

IEEE 754 표준 4배수 정밀도 부동소수점 수 형식

지수 필드가 15비트, 가수 필드가 112비트로 정의
지수의 바이어스 값은 (2의 14승 - 1) = 16383이며, 지수의 범위는 -16382 ~ +16383이 됨. 결과적으로, 이 형식으로 표현된 2진수에 대한 10진수는 밑의 식을 이용하여 변환할 수 있음.

IEEE 754 형식의 주요 파라미터들

3.7 부동소수점 산술 연산

3.7.1 덧셈과 뺄셈

① 두 소의 소수점 위치를 일치시킴
② 가수들 간에 더하기를 수행
③ 결과를 정규화 시킴

10진수들 간에 덧셈을 수행하는 예

위와 같이 표기된 수의 가수들을 더하기 위해서는 먼저 그들의 소수점 위치를 일치시켜야 하는데, 그것은 두 수의 지수가 같은 값이 되도록 조정하는 것을 말함. 그런데 소수점 아래의 자리 수를 제한하게 되는 경우에 대비하여 더 작은 수의 지수를 조정하는 것이 유리함. 따라서 위의 계산은 먼저 두 수들의 지수를 10의 -3승으로 일치시킨 다음에, 아래와 같이 덧셈을 수행하면 됨.

부동소수점 덧셈 : 부동소수점 수들 간의 덧셈

첫 번째 단계인 지수 조정은 두 수들 중에서 더 작은 수를 우측으로 시프트 시키거나, 혹은 더 큰 수를 좌측으로 시프트 시킴으로써 수행 될 수 있음. 그런데 수가 저장될 장치의 길이가 제한되어 있기 때문에, 시프트 방향에 따라 최상위 혹은 최하위 비트를 잃게 되는 경우가 발생할 수 있음. 그런 경우에 더 작은 수를 시프트 시키면 잃게 되는 숫자가 상대적으로 작은 값이 됨. 따라서 두 수의 지수 값들이 같아질 때까지 더 작은 수를 오른쪽으로 한 비트씩 시프트 하고, 그 때마다 지수를 1씩 증가시키는 방법을 사용하는 것이 계산 결과의 오차를 줄이는 데 도움이 됨.

그와 같이 지수 값을 일치시킨 다음에는 가수들 간에 덧셈을 수행함. 그런데 이 예의 경우에 그 결과값이 가수가 정규화 된 형태가 아니기 때문에, 가수를 우측으로 한 번 시프트 시키고 지수 값에 1을 더하는 정규화 과정을 수행함으로써 최종 결과값을 얻게 됨.

부동소수점 덧셈의 파이프 라이닝

계산을 연속적으로 수행하기 위하여 데이터들이 두 개씩 순서대로 파이프라인에 입력되어 단계들을 통과하면, 100번의 덧셈들 A(1) + B(1) = C(1), A(2) + B(2) = C(2), ... , A(100) + B(100) = C(100)에 대한 계산 결과들이 연속적으로 산출됨. 결과적으로, 앞에서 살펴보았던 명령어 파이프라인과 마찬가지로 단계 수만큼의 속도 향상을 얻을 수 있게 됨. 이와 같은 산술 연산의 파이프라이닝은 대규모의 부동소수점 계산을 처리하는 대부분의 슈퍼컴퓨터들에서 사용되고 있음.

3.7.2 곱셈과 나눗셈

2진 부동소수점 곱셈 과정
① 가수들을 곱함
② 지수들을 더함
③ 결과값을 정규화

2진수 부동소수점 나눗셈 과정
① 가수들을 나눔
② 피제수의 지수에서 제수의 지수를 뺌
③ 결과값을 정규화

부동소수점 연산 과정에서 발생 가능한 문제점
• 지수 오버플로우 : 양의 지수값이 최대 지수값을 초과함. 어떤 시스템에서는 이 경우에 결과값을 +∞ 또는 -∞로 세트
• 지수 언더 플로우 : 음의 지수값이 최대 지수값을 초과함. 이것은 그 수가 너무 작아서 표현될 수 없다는 것을 의미하는데, 이 경우에 결과값을 0으로 세트하기도 함.
• 가수 언더플로우 : 가수의 소수점 위치를 조정하기 위하여 우측 시프트를 수행하는 과정에서 비트들이 가수 필드의 우측 편으로 넘치는 경우가 있음. 즉, 가수의 하위 비트들을 버리는 경우에 해당하는데, 이러한 경우에는 반올림 혹은 절삭이 적용될 수 있음.
• 가수 오버플로우 : 같은 부호를 가진 두 가수들을 덧셈하였을 때 올림수가 발생하는 경우가 있음. 즉, 가수의 범위가 초과된 것인데, 이 경우에는 가수를 우측으로 시프트 하고 지수를 증가시켜 정규화하면 됨.

profile
최고가 되기 위해 최선을...

0개의 댓글