Computer Science 기본 지식/컴퓨터 구조

[컴퓨터 구조] 3. 컴퓨터 연산

로파이 2021. 4. 16. 15:02

덧셈과 뺄셈

 

일반적인 이진수의 덧셈과 뺄셈 연산이 적용된다.

 

오버플로우가 발생하는 경우

표현되는 정수 범위가 최대 양의 범위 혹은 최대 음의 범위가 넘었을 때 오버플로우가 발생

 

덧셈의 경우 A + B

  • 부호가 같은 두 피연산자를 더했을 때, 음수가 되는 경우 (부호 비트가 바뀌는 경우)
  • 양수와 양수를 더했는데 부호 비트가 1이 되었다. (음수)
  • 음수와 음수를 더했는데 부호 비트가 0이 되었다. (양수)

부호가 다른 두 피연산자를 더한 경우 두 피연산자의 큰 범위보다 넘을 수 없으므로 오버플로우가 발생하지 않는다.

ex) 7 + (-5) < |7| : 결과의 크기는 항상 7보다 작다.

 

뺄셈의 경우 A - B

양수에서 음수를 뺏을 때 혹은 음수에서 양수를 뺏을 때 오버플로우가 발생할 수 있다.

 

부호가 같은 피연산자를 뺄 경우에는 오버플로우가 발생하지 않는다.

ex) 5 - 7 < |7| : 결과의 크기는 항상 7보다 작다.

 

 

곱셈과 나눗셈

 

곱셈 연산

곱셈 연산

첫번째 피연산자는 피승수(Multiplicand)라고 부르고 두번째 연산자는 승수(Multiplier)라고 부른다. 최종 결과는 곱(Product)에 저장된다.

 

n비트 피승수와 m비트 승수를 곱하면 (n+m)비트 길이를 갖는 결과가 나온다.

 

곱셈의 단계는 다음 단계가 이루어진다.

  • 승수의 자리수가 1이면 피승수를 해당위치에 복사한다.
  • 또는, 승수의 자리수가 0이면 0을 해당위치에 복사한다. 
  • 위 단계가 끝나면 피승수를 왼쪽으로 shift하고 중간 결과를 계속 더해주는 식으로 계산된다.

 

나눗셈 연산

나눗셈 연산

나눗셈의 피연산자는 피제수(Dividend)와 제수(Divisor) 두개이고, 몫(Quotient)과 나머지(Remainder)라 불리는 결과가 있다.

 

Dividend = Quotient X Divisor + Remainder

 

각 단계에서 제수를 뺏을 때 0보다 크면 1을 넣고 제수를 오른쪽으로 shift하며 계산한다.

 

부동소수점 표현

 

0.75를 이진수로 표현하면 $0.11_{2}$가 된다. 정규화된 표현으로 선행하는 0이 없는 표기법으로 나타내면 $1.1_{2} \times 2^{-1}$가 된다.

 

컴퓨터에서 실수의 소수부를 표현할 때 소수점의 위치가 고정되지 않은 부동소수점 표현을 사용한다.

 

단일 정밀도 (float)

단일 정밀도 표현

실수는 지수부(exponent)와 소수부(fraction) 그리고 부호 비트(sign)으로 이루어져 있다. 일반적으로 부동소수점 수는 다음과 같은 형태를 갖는다. 32비트로 표현되는 float은 8비트의 지수 필드와 23비트의 소수 필드 그리고 부호 비트로 이루어져 있다.

 

$(-1)^S \times F \times 2^E$

 

F는 소수의 값을 나타내고 E는 지수 부분의 값을 나타낸다. 소수부분 F를 멘티스라고도 한다.

 

오버플로우 / 언더플로우

양수 값을 갖는 지수가 너무 커서 지수 필드에 들어갈수 있는 수보다 크거나(오버플로우) 음수 값을 갖는 지수가 너무 커서 필드에 들어가는 수보다 클 경우(언더플로우) 발생한다.

 

두배 정밀도 (double)

2배 정밀도 표현

지수가 11비트 소수가 52비트를 사용하므로 더 큰 범위와 매우 작은 실수를 표현할 수 있다.

 

IEEE 754 부동소수점 표준

 

표준화된 표현은 소수 부분이 (1 + 0.xxx)로 표현되는 정규화 표현을 사용한다.

 

$(-1)^S \times (1 + 소수부분) \times 2^E$

 

0.0은 선행하는 1이 없기 때문에 미리 예약된 지수값 0을 가지며 $00....000_{two}$는 0을 나타낸다.

또한 모두 1인 경우 $11...111_{two}$는 부동 소수점으로 표현할 수 없는 범위의 수를 나타낸다.

 

소수부분은 이진화된 표현으로 10진수를 다음과 같이 나타낸다.

 

$(-1)^S \times (1 + (s1 \times 2^{-1}) + (s2 \times 2^{-2}) + (s3 \times 2^{-3}) + ... ) \times 2^E$

 

바이어스된 표현법

지수부분을 2의 보수법으로 표현하면 숫자의 정렬이 어렵게 된다. 2의 보수 표현을 사용하면 $1.0 \times 2^{-1}$ = 0(부호비트) 11111111(지수부분) 0000....는 매우 큰 수처럼 처럼 보인다.

 

가장 음수인 지수를 00000...가장 양수인 지수를 11111...로 표현하기 위해 바이어스를 도입한다. 실제 지수 E를 구하기 위해 지수 필드의 값에서 바이어스 값을 뺀다.

 

E = 지수 - 바이어스

  $(-1)^S \times (1 + 소수부분) \times 2^{(지수-바이어스)}$

 

단일 정밀도에서 바이어스는 127, 두배 정밀도에서 1023을 사용한다. 2^{-1}은 지수 필드에서 -1 + 127 = 126으로 표현된다.

  • 지수 필드가 모두 0과 1인 경우 00000000 / 11111111는 예약되어 있으므로
  • 가장 작은 수의 지수는 00000001 -> 1 - 127(바이어스) = -126 이고
  • 가장 큰 수의 지수는 11111110 -> 254 - 127(바이어스) = 127 이다.

따라서 단일 정밀도에서 표현할 수 있는 가장 작은 수와 가장 큰 수는 다음과 같다.

 

$\pm 1.00000... \times 2^{-126}$

$\pm 1.11111... \times 2^{127}$

 

1) -0.75를 IEEE754 이진 표현법의 단일 정밀도로 표현하라

 

$-0.75 = - 0.11_{2} = - 1.1_{2} \times 2^{-1}$

 

1부호 비트(음수)와 소수 부분은 1000000000... 이고 지수 부분은 -1 + 127 = 126, 01111111으로 표현한다.  

 

2) 부호비트가 1, 지수 부분이 129, 소수 부분이 0100000...인 수를 구하여라

 

$(-1)^{1} \times (1.25) \times 2^{129-127} = -1 \times 5= -5$ 

 

부동 소수점 덧셈/뺄셈/곱셈/나눗셈

 

1. 두 수의 지수 부분을 맞춘다.

2. 소수 부분 연산과 지수 부분을 따로 산술 연산한다. 

3. 결과에 대한 언더플로우와 오버플로우를 검사한다.

  - 단일 정밀도에서 지수 부분이 (양수)127이 넘거나 (음수)-126보다 작은 경우

 

덧셈 예제

다음 두 부동 소수점을 계산해보자.

$0.5_{ten} + (-0.4375_{ten})$

 

1단계: 작은 지수를 갖는 소수점을 큰 지수 표현으로 맞춘다.

먼저 두 십진수를 이진수로 표현하면 다음과 같다.

 

$1.000_{2} \times 2^{-1}$

$-0.4375 = -0.111_{2} \times 2^{0} = -1.110_{2} \times 2^{-2}$

 

 

작은 지수를 갖는 소수의 유효자리를 큰 지수 값을 갖도록 맞춘다.

 

$-1.110_{2} \times 2^{-2} = -0.111_{2} \times 2^{-1}$

 

2단계: 두 수의 유효자리를 더한다.

 

$1.000_{2} \times 2^{-1} -0.111_{2} \times 2^{-1} = 0.001_{2} \times 2^{-1}$

 

 

3단계: 오버플로우와 언더플로우를 검사하면서 합을 정규화한다.

 

$0.001_{2} \times 2^{-1} = 1.000_{2} \times 2^{-4}$

 

 

-4는 -126보다 크고 127보다 작으므로 언더플로우와 오버플로우가 발생하지 않는다. 바이어스된 지수는 -4 + 127 값 즉 123을 가진다.

 

4단계: 유효 자릿수가 소수 필드 비트 수보다 크다면 반올림하여 계산한다.

4비트만 필요하므로 추가적인 자리맞춤이 필요없다.

 

곱셈 예제

다음 두 부동 소수점을 계산해보자.

 

$0.5_{ten} \times (-0.4375_{ten})$

 

먼저 두 십진수를 이진수로 표현하면 다음과 같다.

 

$1.000_{2} \times 2^{-1}$

$-0.4375 = -1.110{2} \times 2^{-2}$

 

1단계: 두 지수를 더하면 다음과 같다.

 

$ -1 +(-2) = -3 $

 

2단계: 두 유효자리를 곱한다.

 

$1.000_{2} \times 1.110_{2} = 1.110_{2}$

 

곱의 결과는 $1.110_{2} \times 2^{-3}$이다.

 

3단계: 정규화가 필요하다면 정규화하고 오버플로와 언더플로를 검사한다.

-3은 -126보다 크고 127보다 작기 때문에 오버플로/언더플로가 발생하지 않는다.

 

4단계: 자리 맞춤을 진행한다.

유효 숫자가 일반적인 단일 정밀도로 모두 표현될 수 있다.

 

5단계: 원래 피연산자들의 부호가 다르므로 곱의 부호를 음수로 만든다.

 

최종 결과는 $-1.110 \times 2^{-3}$이 된다.

 

 

참고 : Computer Organization and Design RISC-V edition