본문 바로가기

Library/Computer System

Normalization

만약, 71.3125(+1000111.0101)를 표현하기 위해서는 먼저 부호(sign), 모든 비트, 그리고 소수점의 위치를 메모리에 저장해야 한다. 이것은 가능한 이야기임에도 불구하고, 이 방법은 수를 계산하는 것은 복잡하게 만든다. 표준화된 부동소수점(floating point) 표현 방법이 필요할텐데, 그 방법은 소수점 자리의 왼쪽에 1만 남기도록 소수점 자리를 이동하는, 표준화(normalization)이다.

어떤 수의 원래 값을 알기 위해서, 2^e를 곱해야 하며, e는 이동한 소수점 자리이다. 왼쪽으로 이동하는 것은 양수(positive)를 나타내며, 오른쪽으로 이동한 것은 음수(negative)를 나타낸다. 부호는, 원래 값의 부호에 따른다.


Examples of normalization
+101001.11001 : +2^6 * 1.01000111001
-111.000011 : -2^2 * 1.11000011
+0.00000111001 : +2^(-6) * 1.11001
-0.001110011 : -2^(-3) * 1.110011


어떤 수가 표준화되었다면, 이 수에 대해서 부호, 지수(exponent), 그리고 가수(mantissa, 소수점 자리의 오른쪽에 있는 모든 비트)만 저장하면 된다. 예를 들어, +1000111.0101은 다음과 같이 된다.

+2^6 * 1.0001110101
sign : +
Exponent : 6
Mantissa : 0001110101

소수점 자리의 왼쪽에 있는 1은 저장할 필요가 없다. 표준화되었다면 언제나 1이기 때문에, 굳이 저장할 필요가 없다.


IEEE 표준(Institute of Electrical and Electronics Engineers Standards)은, 부동소수점을 저장하는 표준을 정의하고 있다. 단정밀도(single precision)과 배정밀도(double precision)이다.


a. Single Precision (32 bit)
1       8                     23
Sign  Exponent         Mantissa
        Excess_127

b. Double Precision (64 bit)
1       11                  52
Sign  Exponent        Mantissa
        Excess_1023


만일, 단정밀도로 어떤 수를 표준화하여 저장하고자 한다면, 다음 과정을 따른다.

1. 양수라면 0, 음수라면 1로 부호 비트를 저장한다.
2. 익세스_127(Excess_127) 방식으로 지수를 저장한다.
3. 부호 없는 정수형(unsigned integer)을 사용하여 가수를 저장한다.


예를 들어, +2^6 * 1.01000111001을 저장한다면, 부호 비트는 0이며, 지수는 6이다. 6을 익세스_127로 표현하고 싶다면, 127을 더해서 133을 얻는다. 133은 10000101이다. 가수 부분은 01000111001이다. 가수 부분에 할당된 23비트에 맞추기 위해, 0100001110010000000000000로 비트를 늘린다. 이것을 저장하면 된다.

만약, 단정밀도 저장된 부동소수점을 변환하고자 한다면, 다음 과정을 따른다.

1. 부호인, 가장 왼쪽의 비트를 사용한다.
2. 다음 8 비트를 십진수로 변환하고, 127을 뺀다. 이것이 지수가 된다.
3. 1을 추가하고(표준화 과정에서 저장할 필요가 없었던 1), 다음 23비트는 소수점 아래가 된다. 오른쪽의 0은 무시할 수 있다.
4. 지수값을 사용해서 정확한 소수점 자리로 이동한다.
5. 정수 부분을 십진수로 변환한다.
6. 분수 부분을 십진수로 변환한다.
7. 정수 부분과 분수 부분을 조합한다.


Copy from
Behrouz A. Forouzan, Foundations of Computer Science, Thomson Books / Cole