본문 바로가기
CS/컴퓨터 구조

[Chapter 3.4 컴퓨터 구조 및 설계] 부동소수점 표현 Normalized Denormalized Form

by 베어 그릴스 2022. 7. 13.
320x100
본 정리는 CS422-컴퓨터 구조 및 설계 : 하드웨어/소프트웨어 인터페이스. David A. Patterson, 존 헤네시 책을 바탕으로 하고 있음을 미리 알립니다.

 

우리가 지구의 나이 같은 엄청 큰 수를 표현하고 싶다거나, 소수점 아래의 작은 수까지 2진수로 표현하려면 어떻게 해야 할까?

 

아마도 32bit의 interget 표현의 이진수로는 어림도 없을 것이다.

 

이런 소수 실수 등을 컴퓨터가 알아들을 수 있게 2진수로 표현하기 위해 나온 것이 바로 부동 소수점 표현 방식이라고 부른다.

 

부동 소수점 표현 방식


우선 소수를 생각해보면, 0.001 x 2^-2와 1.0 x 2^-5은 자명하게 같은 수이다.

 

이런 소수를 똑같은 이진수로 나타내기 위해서 정규화된 표현이 필요한데, 위 사진과 같이 앞이 무조건 1.~  * 2^y인 표현이 우선 정규화된 표현이다.

 

즉, 0.001 x 2^-2 같은 수를 정규화된 표현으로 나타내면, 1.0 x 2^-5이 되는 것이다.

 

레지스터의 크기가 32bit인 컴퓨터에선 이런 수도 32bit의 2진수로 표현해야만 한다.

그래서 정규화된 표현에서 소수 부분(fraction) xxxxxxx와 지수 부분(exponent) yyyyyyy를 나눠서 32bit에 표현한다.

s는 sign bit을 의미한다.

 

부동 소수점 표현 방식을 설계하는 사람은 소수 부분의 크기와 지수의 크기 사이에서 타협점을 찾아야 한다.

소수 부분의 크기를 늘리면 수의 정확성이 늘겠지만 지수 부분의 크기가 줄어들어 표현할 수 있는 수의 범위가 줄게 될 것이다.

 

현재 거의 전 세계적으로 모든 컴퓨터에 쓰이고 있는 IEEE Std 754-1985 부동 소수점 표현식을  알아보자.

 

32bit를 표현할 때, 보통 우리가 흔히 아는 float형을 말하고, 이때 지수 부분이 8bit 실수부분이 23bit 차지한다. 이를 Sigle Precision 이라고 한다.

64bit를 표현할 때, 보통 우리가 흔히 아는 double형을 말하고, 이때 지수부분이 11bit 실수부분이 52bit 차지한다. 이를 Double Precision 이라고 한다.

 

s field엔 sign bit가 온다고 생각하면 된다. 즉 음수면 1, 양수면 0이 될 것이다.

 

E field엔 지수부분이 오는데 지수를 e라고 하면 e는 -의 음수일 수도 있으므로 e에 bias를 더한 수가 와야 한다. 즉, Sigle Precision일 때는, 가장 음수인 지수를 0000000으로 표현하기 위해  127이 bias가 되고, Double Precision일 땐 1023이 bias가 될 것이다.

 

예를 들어 1.11 x 2^-100이었다고 하면, -100 + 127 = 27 = 00011011이 E에 오게 될 것이다.

 

F field는 맨 앞의 1은 모든 정규표현식이 같으므로, 더 정확하게 표현하기 위해 없다고 생각하고 표현한다. 즉, 앞에 1을 제외한 소수 부분이 그대로 F field에 오게 된다.

 

예를 들어 1.11 x 2^-100이었다고 하면, 1100000...000이 F에 오게 된다.

 

 

예시 문제

–0.75를 부동소수점 표현 방식으로 표현하시오.(sigle이라고 가정)

 

답 ↓

더보기

-0.75는 -0.11(이진수)이다.

 

정규 표현식 : -1.1 x 2^-1

 

즉,

S field = 1

E field = -1 + 127 = 126 = 01111110

F field = 10000..000

 

답:

1 01111110 1000...000

 

 

1 10000001 01000…00 을 정규 표현식으로 나타내시오.(sigle이라고 가정)

 

답 ↓

더보기

S field = 1 즉, 음수

E field = 10000001

 

10000001 = 129

 

129 - 127 bias = 2 

 

즉 답은 -1.01 x 2^2 이다. 

 

 

 

정규화된 형식에서 E는 0000 0001 ~ 1111 1110의 범위를 갖는다.

 

즉 가장 큰 수는 0 1111 1110 1111...1111 일 것이고, 가장 작은 수는 1 1111 1110 1111...1111이 될 것이다.

 

0에 가장 가까운 수는 0(1) 0000 0001 0000..000이 될 것이다.

 

그렇다면 0은 어떻게 표현할 수 있을까?

 

이는 비정규화 형식(Denormalized form)에서 표현한다. 

Denormalized form은 E feild가 모두 0이거나 1인 표현식을 말하며, 0 혹은 0에 아주 가까운 수들, 무한대인 수들 혹은 숫자가 아닌 수들을 표현한다.

 

각 표현식은 다음과 같다.

E field가 모두 0이면 정규화된 표현식처럼 1.~로 표현되는 것이 아니라 0.xxxxx * 2^yyy 라고 생각하면 된다.

즉, F field도 모두 0이 되면 0이 되는 것이다. 

 

sign bit가 달라져도 0임을 유지하므로 0의 표현에는 1 0000000 000..00 / 0 00000000 000..00의 두 가지가 있다.

 

E field가 모두 1이고 F field가 모두 0일 때는 무한인 수를 말하며 F field가 0이 아니면 숫자가 아님을 나타낸다.

 

 

이것으로도 표현할 수 없는 수도 있는데, 이런 수를 표현하려 할 때 overflow 혹은 underflow의 오류가 난다.

 

이를 해결하기 위해서 Single precision 대신 Double precison을 쓸 수 있다.

728x90