원래는 제 8편에서 'Fixed Point Processor'라는 주제로 글을 써나가고자 했었는데, 지난 2주동안에 또다시 'Floating Point Processor'에 대한 환상을 가지고 계신분들을 적잖이 만나게 되어서 번외 경기로 'Floating Point Processor의 한계' 라는 주제로 제8편을 준비하게 되었다.
7편에서 언급한 Floating Point Number에 대해서 조금더 자세히 알아보도록 하자. 마이크로프로세서에서 floating point number, 즉, 소수를 표현하는 방법은 여러 가지가 있으나 IEEE에서 754번째 규약으로 표준화 했다. IEEE Standard 754에 따르면, 32비트 데이터에서 소수는 다음과 같이 표현을 한다.

[그림 1] IEEE Std. 754 - Single Precision Floating Point Number
Floating Point Processor는 그림 1과 같은 형태로 소수를 표현할 수 있는 회로를 탑재하고 있다.
그림 1을 통해서 소수는 어떻게 표현될까? 제7편의 표에서 보았듯이, IEEE Std.754에서는 여기에 대한 규정을 두고 있다. 총 5가지의 규약을 정해 놓고 있는데, 이 내용을 이번에 좀 더 심도있게 분석해보도록 하자.
1. e = 255 이고, f가 0이 아니면,
NaN( Not A Number : 숫자가 아니다라는 뜻이다.) 주로 나누기 0 과 같은 연산이 일어날 때 발생한다.
2. e = 255 이고, f가 0이면,
31번비트인 s(sign 비트, 부호비트) 에 따라서 양의 무한대 혹은 음의 무한대를 표현한다.
3. 0 위 그림1을 보면, 하위 23비트로 표현된 부분이 mantissa(밑)로 구분되어져 있고, fraction이라는 말이 붙어있다. fraction이라는 말은 분수라는 뜻인데, 디지털로 수를 표현하다보니 밑은 2의 분수승으로 수를 표현한다. 예를 들어, 밑이 000 0000 0000 0000 0000 0001 이렇게 표현되어 있다면, 이는 2^(-23)을 뜻한다. 만약, 100 0000 0000 0000 0000 0000 이라면, 2^(-1)이 되겠다. 하나더 해보자. 100 1000 1000 1000 1000 0010 이라면, 2^(-1) + 2^(-4) + 2^(-8) + 2^(-12) + 2^(-16) + 2^(-22) 이 된다. 이렇게 표현하는 것을 fractional form으로 표현한다고 한다. 이는 fixed point processor에서 소수를 표현하는 방법이 된다. 제 9 편에서 자세히 다룰 예정이다. 4. e = 0이고, f가 0이 아니면 수치 = [(-1]^s]*[2*(-126)]*(0.f) 5. e=0 이고 f=0 이면, 수치 = 0 위 다섯가지 규약을 통해서, 다음 숫자들을 32비트 단정밀도(Single Precision) floating number로 표현해보자. (단정밀도라는 말, 여전히 마음에 안든다. 단정밀도와 대비될 수 있는 말로 배정밀도가 있다. 배정밀은 단정밀보다 배로 정밀하다는 뜻으로 64비트로 소수를 표현한다. 좀더 예쁘게, 그 뜻이 잘 와닿는 그런 용어로 바뀌어졌으면 하는 바램이다. ) 10.0을 IEEE Std.754 규격에 맞도록 표현해보자. 일단 양수이니깐, s = 0 일테고, 위에서 언급한 다섯 개의 규약중에 3번에 포함이 되겠기에 3번의 수식을 놓고 구해보면 얻을 수 있을 것이다. 10.0 = [2^(e-127] * (1.f) 위 수식에서 e 와 f를 구하면 된다. 어떻게 구할까? 1.f는 어떠한 일이 있더라도 1보다 크고 2보다 작다. 따라서, 2^(e-127) 이라는 부분이 10보다 작아야 하고 5보다는 커야 한다. 그렇다면, 2^(e-127) = 2^3 일 수밖에 없다. 따라서, e -127 = 3, e = 130, 이진수로 표�h하면 e(2) = 1000 0010 이 된다. 2^(e-127)이 8이기에 남은 부분인 1.f가 1.25가 된다면, 10.0이 된다. f = 0.25가 되어야 하고, 0.25는 2^(-2)이다. 따라서, f = 010 0000 0000 0000 0000 0000 이 된다. s, e, f를 모두 모아서 32비트를 구성하면 다음과 같다. 0 1000 0010 010 0000 0000 0000 0000 0000 = 0x4120 0000 이 된다. 즉, 메모리에 0x4120 0000 이 들어 있는데, 이를 floating point로 읽게 되면 10.0 이 된다는 것이다. 탄력을 받아서, 0.0000 0023 8을 IEEE Std.754로 표현해보자. 0.0000 0023 8 도 IEEE 754의 규격중 3번째에 속한다.일단 양수이니 s=0이다. 1.f 라는 수치는 여전히 1보다 크고 2보다 작으니, 지수부분이 127보다 작아야 할 것이다. 이를 3번규약 수식에 적용해서 구해보면, 0x347F 8CF1 이라고 표현된다. 좀 복잡한데, 시간 날 때 한번해보시기 바란다. 10.0 + 0.0000 0023 8을 해보자. 10.0 + 0.0000 0023 8 = 10. 0000 0023 8 이다. 이 수치가 IEEE Std. 754로 표현이 될까? 이진수로 이 내용을 표현한다면, 0x4120 0000 + 0x347F 8CF1 = ? 이 된다. ?이 얼마가 될까? 0x4120 0000 + 0x347F 8CF1 = 0x4120 0000이 된다. 왜 이럴까? 참고로 0x4120 0000 은 10.0 이고 0x4120 0001은 10.0000 0095 0이다. 즉, 10.0이라는 수치를 표현하다 보니 지수 부분(e-127)이 0.0000 0023 8 이라는 수치를 표현할 수 없을정도로 커져 버려서 아주 작은 수를 표현하지 못하는 것이다. 즉, 정밀도가 떨어지는 것이다. 32비트 Fixed Point Processor에서는 10.0000 0023 8을 거뜬히 표현하고도 남는다. 다음편에서 자세히 살펴보도록 하자.