7. 컴퓨터의 수 연산 (Arithmetic of Computer)
나눗셈
컴퓨터에서 정수의 나눗셈을 알아보자. 컴퓨터에서의 나눗셈은 곱셈에 비해 상대적으로 복잡하고, 많은 컴퓨팅 자원이 소요된다.
우리가 나눌 수를 dividend, 나누는 수를 divisor, 나누어진 수를 quotient, 나머지를 remainder라고 한다.
- 먼저 수를 0으로 나누는 것은 아닌가 확인하고 이 경우, 예외 처리를 한다. (0으로 나눌 수 없음)
- divisor $\leq$ dividend bit 일 경우, quotient에 1 비트를 넣고, dividend bit에서 divisor를 뺀다.
반대의 경우에는 quotient에 0 비트를 넣는다. (Long division Approach) - 다음 비트로 넘어가서 2를 반복하여, quotient와 remainder를 구한다. 일반적인 나눗셈과 똑같다.
나눗셈은 이렇듯 순차적으로 실행되기 때문에, 병렬 수행이 가능한 곱셈에 비해 오랜 시간이 요구된다.
MIPS에서의 나눗셈
MIPS에는 나눗셈의 결과인 몫과 나머지를 저장하는 전용 레지스터 HI와 LO가 있다.
div rs, rt 명령어를 통해 나눗셈을 수행한 후, mfhi, mflo로 HI, LO 레지스터에 접근하여 결과값을 얻을 수 있다.
이때, 오버플로와 0으로 나누기 확인을 하지 않으므로 별도 처리가 필요하다.
Floating Point
컴퓨터에서, 실수는 부동소수점Floating Point으로 표현된다. 실수는 아래 형태로 저장된다.
$$ 1.xxxxxx{(2)} \times 2^y $$
IEEE STD 754-1985
이는 IEEE 표준으로 지정되어 있는데, 32비트에서는 싱글 프리시전Single Precision, 64비트에서는 더블 프리시전Double Precision 표현 방식을 사용한다.
S (Signed) 부호 비트 | Exponent | Fraction |
1비트 | 8비트 (싱글) | 23비트 (싱글) |
1비트 | 11비트 (더블) | 52비트 (더블) |
이렇게 할당된 실수의 해석은 다음과 같다.
$$ x = (-1)^S \times (1+\text{Fraction}) \times 2^{(\text{Exponent} + \text{bias})} $$
이때, bias는 싱글 프리시전에서 127, 더블 프리시전에서 1203이다.
이때, Exponent 0000000과, 11111111은 예약되어 있으므로 쓰면 안된다.
더블 프리시전이 항상 좋을까?
더블 프리시전은 싱글 프리시전에 비해 더 넓은 표현력을 갖지만, 연산 속도가 느리므로 시의적절하게 활용해야 한다.
Floating Point 실습
$0.75$를 싱글 프리시전으로 바꿔보자.
$$ 0.75 = 0.11_{(2)} = (-1)^0 \times 1.1 \times 2^{-1} $$
$$ S = 0, \text{Fraction} = 1, \text{Exponent} = -1 +127 = 126 = 01111110_{(2)}$$
$$ 00111111010000\cdots00$$
언더플로우
부동소수점으로 표현 가능한 가장 작은 값(부호를 막론하고)과 0 사이의 값을 갖게 되는 경우를 언더플로우가 발생했다고 표현한다.
언더플로우가 발생하면 부동소수점의 Normalized가 풀리게 되는데, 이 경우 하드웨어로 연산이 불가능하기 때문에 소프트웨어가 개입하여 예외 처리한다. 이 때문에, 처리 속도가 느려지게 된다.
부동소수점의 덧셈
$9.999 \times 10^1 + 1.610 \times 10^{-1} $을 계산해보자.
- 우선, 더 작은 지수를 갖는 수의 지수부를 큰 수와 맞춘다.
$9.999 \times 10^1 + 0.016 \times 10^1 $ - 이제 서로 더한다.
$10.015 \times 10^1$ - 값을 일반화하고, 언더플로나 오버플로의 발생을 확인한다.
$1.0015 \times 10^2 $ - 값을 적절히 버림하고 필요하다면 다시 일반화한다.
$1.002 \times 10^2 $
부동소수점의 덧셈은 정수의 덧셈보다 오랜 시간에 걸쳐 처리된다.
부동소수점의 곱셈
곱셈은 간단하다.
$1.110 \times 10^{10} \times 9.200 \times 10^{-5} $를 해보자.
- 지수는 서로 더한다.
$10^{10-5} = 10^5$ - 값들은 서로 곱한다.
$1.110\times9.200 = 10.212 => 10.212 \times 10^5$ - 값을 일반화하고, 오버플로나 언더플로를 확인한다.
$ 1.0212 \times 10^6 $ - 값을 적절히 버림하고 필요하다면 다시 일반화한다.
$ 1.021 \times 10^6 $ - 부호 비트의 연산결과에 따라 부호를 달아준다.
부동소수점의 곱셈은 덧셈기와 비슷한 정도의 복잡도를 갖는다. 즉, 부동소수점은 곱셈이 덧셈보다 빠르다.
SISD, SIMD
Single Insturction Single/Multiple Data.
한 명령어에 대해, 하나의 데이터가 주어지는지 여러개의 데이터가 주어지는지를 이르는 용어로 SIMD는 벡터 연산이라고도 한다.
'학부 수업 > 컴퓨터구조' 카테고리의 다른 글
9. 파이프라인 (Pipelining) (0) | 2020.11.30 |
---|---|
8. 데이터패스 (The Datapath) (0) | 2020.11.24 |
6. 컴퓨터의 정수연산 (Integer Arithmetic of Computer) (0) | 2020.10.27 |
5.5 프로그램의 실행 과정 (0) | 2020.10.12 |
5. 메모리 접근 (Addressing) (0) | 2020.10.12 |
댓글
이 글 공유하기
다른 글
-
9. 파이프라인 (Pipelining)
9. 파이프라인 (Pipelining)
2020.11.30 -
8. 데이터패스 (The Datapath)
8. 데이터패스 (The Datapath)
2020.11.24 -
6. 컴퓨터의 정수연산 (Integer Arithmetic of Computer)
6. 컴퓨터의 정수연산 (Integer Arithmetic of Computer)
2020.10.27 -
5.5 프로그램의 실행 과정
5.5 프로그램의 실행 과정
2020.10.12