※ 질문/내용오류/공유할 내용이 있다면 jinkilee73@gmail.com으로 메일 주세요 :-)
이번에는 Floating Point Number에 대해서 이야기 해보도록 하자.
왜 Floating인가? Floating의 원래의 의미는 떠다닌다는 의미이다. 떠다닌다 라는 것은 움직인다 정도로 해석하면 될 것 같다. 그렇다면 뭐가 움직인다는 것이냐? 이제부터 그것을 알아보자.
컴퓨터에서 소수를 표현하는 방법이 Floating Point Number이다. Floating Point Number는 부호, 지수(exponent), 가수(mentisa) 부분으로 설명할 수 있다. 그런데 컴퓨터에서 데이터를 표현할 때 비트수의 한계가 있다. 가령 최근의 컴퓨터는 대부분이 32비트이기 때문에 32비트 환경을 가정하고 말해보자.
32비트의 비트열을 컴퓨터는 다음과 같이 사용한다.
위와 같이 소수를 표현할 때 지수와 가수를 가지고 표현을 하면 하나의 숫자를 표현하기 때문에 한 숫자를 표현하는 여러가지 방법이 있다. 가령 0.1을 표현할 때 (우선은 10진수를 생각해보자)
0.1 = 1 x 10의 -1승
0.1 = 10 x 10의 -2승
...
하나의 소수를 표현하는데 무수히 많은 방법이 있다. 지수가 움직이면서 표현을 하니까 움직인다.. 떠다닌다.. Floating.. Floating Point Number라고 하는 것이 아닌가 싶다. 나는 이 부분을 공부할 때 이런 질문이 떠올랐다. 하나의 숫자를 여러 방법으로 표현한다면 컴퓨터 입장에서는 귀찮을 거 같다는 생각이다. 뭔가 체계화된 하나의 규칙이 있어야 할 것 같았다. 생각을 해보니까 컴퓨터에서 소수 하나를 표현하는 방법은 한 가지 밖에 안나오는 것 같다. 그 이유는 가수의 범위 때문이다. 가수는 고등학교 수학에서도 배웠듯이 1을 포함한 1과 2사이의 숫자이다. 하나의 소수를 표현할 때 가수의 범위가 정해져버리니까 당연히 지수부의 숫자는 하나밖에 올 수가 없다.
가령 165.75를 컴퓨터가 이해하는 32비트 표현으로 바꿔보자.
165.75를 2진수로 바꾸면 10100101.11가 된다. 이 숫자를 지수와 가수 부분으로 나누어서 표현해보자.
2의 0승 x 10100101.11
2의 1승 x 1010010.111
...
2의 7승 x 1.010010111
가수는 범위가 1과 1 사이라고 했으므로 저 많은 것들 중에 컴퓨터가 택하는 것은 하나이다.
2의 7승 x 1.010010111 가 되겠다.
그렇다면 이것을 정말 32비트로 표현해보자.
우선 부호비트는 0이 된다. (+는 0, -는 1)
지수의 8비트를 구할 때 새로운 개념 bias라는 것이 등장한다. bias를 왜 하는지는 조금 뒤에 설명하겠다. 우선은 그냥 그러려니 하자. bias를 구하는 식은 아래와 같다.
bias = 2의 (w-1)승 - 1
단, w는 비트 수
컴퓨터에서 지수부는 8비트로 표현되기 때문에 컴퓨터에서의 bias는 2의 (8-1)승 - 1 = 127 이 된다. 이 bias를 무조건 지수와 더해라. 궁금해하지 말고 더하자. 뒤에 다 설명할 예정이다.
따라서 7 + 127 = 134 = 10000110(2진수)가 된다.
마지막으로 가수부분이다. 가수는 1.010010111이다. 모든 가수는 1을 기본적으로 가지고 있기 떄문에 1은 무조건 있다고 치고, 그 뒤부터 23비트에 표현하게 된다. 따라서 01001011100..00 이 된다.
정리하면 이와 같다.
165.75 = 0 10000110 01001011100000000000000 (2진수)
여기서 지수부분을 보자. 지수부분이 00000001 과 11111110사이인가? 그렇다. 그러면 우리는 이 영역을 nomalized 영역이라고 부른다. 한마디로 노말한 실수를 표현하는 부분이라고 생각하자. 이 가수부가 00000000이 되면 우리는 denomalized 영역이라고 부른다. 이는 매우 작은 숫자들을 표현할 때 사용하는 방법이라고 생각하자. 만일 지수부가 11111111이 되면 무슨 뜻일까? 이는 무한대를 표현하는 방법이라고 한다.
※ denomalized 영역에서 bias를 계산할 때 예외가 있다. 보통은 컴퓨터가 표현하는 지수부에서 bias를 빼면 지수가 나온다. 그런데 denomalized 영역에서는 지수부가 00000000임에도 불구하고 1 - bias를 한다. 32비트 환경에서는 1 - 127 = -126 이다. 즉 32비트 환경에서의 denomalized 영역은 2의 -126승을 표현한다.
한 가지 재밌는 것을 소개해주려고 한다. 2진수 Floating Point Number 를 10진수로 바꿔주는 프로그램이다. 아래의 링크를 따라가보라. 이걸로 많이 연습해보면 좋을 것 같다.
http://media1.ajdesigner.com/p_ieee_754_word.swf
이제 이 Floating Point Number의 대단한 점을 설명해보자한다.
표로 한번 봐보자
32비트로 표현을 할 경우 너무 헷깔릴 것 같아서 짧게 8비트를 가지고 Floating Point Number를 표현해봤다. 굉장히 신기한 것은 largest denorm 값에서 자연스럽게 smallest norm으로 넘어간다는 것이다. 7/512 다음에 8/512가 나오지 않는가. 이것에 대한 2진수 표현 역시 0 0000 111에서 0 0001 000으로 자연스럽게 넘어간다. bias를 사용하지 않으면 이게 불가능해진다. (각자 해보도록 해보자.) nomalized 영역에서 largest norm 부분을 한번봐보자. 240이 표현 가능한 가장 큰 숫자이고 그 다음 큰 수가 224이다. 그렇다. 사람이 생각하는 것처럼 Floating Point Number는 모든 숫자를 차례대로 표현하지는 못 한다.
그렇지만 이것은 8비트로 Floating Point Number를 표현했을 경우이다. 32비트로 표현하면 훨씬 큰 숫자, 훨씬 작은 숫자를 표현할 수 있기 떄문에 32비트로 Floating Point Number를 표현하면 우리가 필요료 하는 숫자들은 전부 표현가능하다고 한다.
32비트로 표현하면 얼마나 대단하게 작은 또는 큰 숫자를 표현할 수 있는지 봐보자.
어마어마한 숫자이다. 2의 127승이 분모로 들어가면 거의 0이나 다름 텐데.. 혹은 그것이 분자로 들어가면 거의 무한대나 다름 없을 텐데. 그 정도를 32비트로 표현할 수 있다는 뜻이다.
Floating Point Number에 대해서는 이 정도로 마무리 하고 다음부터는 Assembly Language를 공부해봅시다.
'System Programming' 카테고리의 다른 글
[SP] Virtual Memory (Basic Knowledge) (1) | 2013.04.23 |
---|---|
[SP] Virtual Memory (Basic Knowledge) (6) | 2013.04.23 |
[SP] Data Representation (2's complement) (0) | 2013.04.11 |
[SP] Data Representation (0) | 2013.04.09 |
[SP] 시작해보며... (0) | 2013.04.06 |