본문 바로가기

카테고리 없음

부동소수점 (Floating Point)

설명에 쓰인 자료는 [도서명: 컴퓨터구조론, 저자 : William Stallings] 자료임을 밝힙니다.

- 참고로 이성주 교수님으로부터 하드트레이닝 받아서 알게된 지식임을 밝힙니다. ^^ 교수님 감사요. 꾸벅.

4byte float로 설명을 하도록 하겠습니다. (당연히 컴퓨터에 따라 차이는 날 수 있으나 가장 일반적인 방법으로 설명함을 밝힙니다.)

최대한 한글만 사용하였습니다.(여기 관련공부(?)하시는 분일경우라면 그림에 써있는 그대로의 용어를 쓰실것을 권장합니다. 그게 오히려 이해하기 쉬울경우도 있습니다.)

 

 

 전체 32비트 중에서 1비트는 부호의(+,-)표시를 위해 사용됩니다. 그다음 8비트는 2의 몇제곱인지를 나타내기 위해 사용됩니다. 그다음 마지막 23비트는 말그대로 그냥 값을 표현하는 데 사용됩니다. 이게 기본 형식입니다.

여기 까지만 듣고 이해하면 좋겠으나 이해가 잘안되도 상관없습니다. (사실 아직 설명을 정확히 한 것이 아닙니다. 아직 뭐 한 얘기도 없음... 하지만 알고보면 그다지 많은 내용도 아니라는...)

다음의 예제를 보면 자세히 설명을 하면 더욱 이해가 빠르게 될테니 말입니다. 기억할것은 앞에서 말한 세가지가 전부입니다. 헷갈리시는 분은 앞의 세가지를 다시한번 봐주세요! ^^

자~ 그럼 예제를 통해서 보도록 합시다.( 이 예제가 제일 중요합니다~! 개인적으로...)

 

 일단 8개의 비트가 표현가능한 범위는 0~255 즉256개입니다. 이것을 음수와 양수로 나눠쓴다면 당연히 반으로 나눠쓰는것이 좋을것입니다. 2 여기서 2의 보수를 생각하신느 분들도 있을지모릅니다.(일반적으로 이 내용은 2의 보수 뒤에 나오므로 2의 보수를 알고있다는 가정하에 쓰도록하겠습니다. 아직모르시면 이 카페에 있는 2의보수에 관련된 글을 읽으셔도 좋습니다. 굳이 공부 안하셨다고 해도 이해하는데 큰지장을 없을것으로 생각 되기도 하지만요... ^^;;)

하지만 2의 보수는 쓰이지 않고 그냥 이진수를 사용합니다. 그방법에 아까말한 bias를 둡니다. 기준값이라고 보면 됩니다. 127 즉 이진수로 01111111 요값이 0입니다. 그렇다면 10000000 이값은...? 네 그렇습니다. 1입니다. 여기서 한가지 법칙이라고하기엔 초라한 -127을 하면 지수값이 나온다가 성립합니다. 그럼 예제를 보면 10010011 이것은 128+16+2+1 이므로 147 여기서 127을 빼면 20이므로 10100이 됩니다. 좌측의 2의 지수값을 보시면 동일한 것을 알 수 있습니다. 우측의 2의 지수값도 20으로 동일합니다.

이제 말그대로 그냥 값들을 표현하는 23비트만 처리하면 되겠습니다.(짧게쓰고 밥먹으러 가려했으나 쓰다보니... 쫌 길어진점... 그래도 흥미를 갖고 보면 재미있습니다.) 우선 좌측을 봅시다. 1.1010001 이걸 보시면 한가지 사실을 알게되는데 이진수에서 무조건 소수점 앞에 1밖에 못온다는 것을 알 수 있습니다. 수가 0하고 1밖에 없으니.. 만약 0이라면 0.1010001 이되지 않느냐고 하실수도 있지만 과학적표기법에선 무조건 소수점 앞에 0을 제외한 수가 와야 됩니다. 따라서 앞의 표현은 1.010001이 됩니다. 꼭 과학적 표기법 때문이 아니더라도 이렇게 하면 편리한 점이 생깁니다.

소수점 앞은 무조건 1이 오기때문에 굳이 소수점앞의 수를 표현 할 필요가 없는 것입니다. 10100010000000000000000 그렇다면 이것들은 무엇인가... 즉 맨 앞부터 2의-1제곱입니다. 그다음은 2의-2제곱 그다음은 2의-3제곱 (십진수에서도 동일합니다. 소수점 기준으로 소수점 바로뒤는 10의 -1제곱, 10의 -2제곱...) 그렇다면 좀 빡씨지만 계산 가능합니다.

자 해봅시다.(숨한번 크게 쉬고...) 즉 10100010000000000000000은 일단 앞에 1이 있다고 생각하는 것이므로 좌측의 경우에 1.1010001 그냥 이렇게 적으면 됩니다 하지만 10진수로 나타내려면 계산을 ㅎㅎ 1 + (2의-1제곱) + (2의-3제곱) + (2의-7제곱) 요거군요... 이제 공학용계산기가 빛을 발할 차례군요... -.-;; 1+(0.5)+(0.125)+(0.0078125) = 1.6328125 (음 제대로 두들겼군...) 좌측의 십진수 표현 부분과 동일함을 알 수 있습니다. 이제 설명의 다 끝났습니다...

이제 총정리 차원에서 두번째 예제를 같이 풀어봅시다. 2번째껀 1번째꺼랑 좀 비슷하니... 이왕 풀거 마지막꺼 해봅시다. 사실 이것도 비슷하지만 -.-; 자.. 1 01101011 10100010000000000000000 우선 맨 앞이 1이니 부호는 - !! 그담 01101011 아깐 십진수로 했으니 그냥 이진수로 계산해보면 01101011 - 01111111 = - 10100 (여기에서 중요한건 계산시에만 부호가 등장한것뿐이고 2의보수랑 관련 없다는 것 입니다. 주어진 01101011 이진수에서 127을 뺀수를 가리킨다고 생각하시는겁니다. 즉 01111111이라고 써있으면 이건 그냥 0인겁니다.)

자 마지막은... 아까 계산한거 그대로이나... 다시 떠올리시라고 복사해 놓겠습니다.

1 + (2의-1제곱) + (2의-3제곱) + (2의-7제곱) = 1+(0.5)+(0.125)+(0.0078125) = 1.6328125

모든 계산이 끝났군요... 나머지 두문제는 심심하시면 푸시면 됩니다.

기본적인 설명은 끝이구요 추가적인 사항을 더 알아보도록 하겠습니다.

 

 

따져보시면 아시겠지만 32비트를 이용해 표현가능한 수의 범위는 2의 보수를 이용 할 경우 2의31제곱-1부터 -2의31제곱인것을 알 수 있습니다. 그에 반에 부동소수점 경우는 -(1-2의-24제곱)*2의128제곱부터 (1-2의-24제곱)*2의128제곱까지 인것을 알 수 있습니다. 2의 보수의 경우에는 최대최소를 알아내는데 큰 어렴움은 없으실듯 합니다.(앞에서도 말했지만 2의 보수는 공부하셨다는것을 전제로 설명합니다.)

하지만 부동소수점의 경우는... 좀 헛갈릴 수 있습니다. 가장 좋은 방법은 앞의 내용을 가지고 직접 구해 보는 방법입니다.(적극 권장하는 방법 입니다. 직접해보시면 생각보다 어렵지 않다는 것을 알 수 있습니다.) 그래도 그냥 지나가면 무성의 하므로 좀 따져 보자면 일단 부호를 배재하고 최대 최소값을 구한 다음에 부호를 붙이면 위와 같은 형식이 됩니다. 따라서 한쪽만 따지면 한쪽은 자동으로 구해집니다.

우선 오른쪽을 가지고 따져 보겠습니다. 오른쪽의 최소값부터 봅시다. 우선 양수이므로 부호비트는 0이됩니다. 그다음 2의 제곱부분은 가장 작게해야 작은 수가 나오므로 00000000 이렇게 하면 -127이 됩니다.(참고로 이 설명 진행 중에 이해가 잘 안되시면 다시 앞의 설명을 봐주시길 부탁드립니다.) 그다음 실제 값은 당연히 최소가 되게 해야하므로 00000000000000000000000 이렇게 0으로 합니다. 그러면 1이 될 것입니다. 그럼 결과는 1*2의-127제곱이므로 -127제곱이 됩니다.

그 다음 최대값은!! 부호는 당연히 0으로 2의 제곱은 제일 크게해야 하므로 11111111 이러면 128이 됩니다. 값부분도 11111111111111111111111 이렇게~! 그럼 1을 제외하고 (2의-1제곱)+(2의-2제곱)+............+(2의-23제곱) 이렇게 되는데... 이건 표현 하기 않좋습니다. 그대신에 1-(2의-24제곱)으로 앞의 수를 표현 할 수 있습니다. 이를 좀더 알기쉬운 예를 들어 설명하면 이진수 1111 이게 10000 - 1 과 같은걸로 볼 수 있습니다. 이건 누구나 이진수로 빼보면 압니다. 이걸 풀어보면 (2의3제곱)+(2의제곱)+(2의1제곱)+(2의0제곱) = (2의4제곱) - (2의0제곱) ^^;; 직접 응용해서 계산해보세요~! (지수의 표현방식에서 사용가능합니다. 이는 다른곳에서도 효율적으로 사용 가능합니다.)

 

 

32bit로 표현 가능한 가짓수는 2의 32제곱개입니다. 하지만 부동소수점이 표현하는 영역이 2의보수보다 넓다? 이는 바로 부동소수점이 그만큼 듬성듬성 표현한다는 것을 나타내는 것입니다. 앞에서도 봤지만... 소수점뒤의 수들은 2의-몇제곱으로 표현 되기 때문에 모든수를 표현 못한다는것을 손쉽게 알 수 있습니다.

따라서 C언어 프로그래밍을 짤때 float 자료형에서 생기는 오차는 이상한 것이라고 말하기보단 당연한 결과다 이게 결론이 되겠습니다. 이글을 끝까지 읽을 분이 몇분계실지는 모르겠지만 대단히 수고하셨습니다.... 내가봐도 다시보기 졸린 디자인인데... 그림그리긴 귀찮아서... -.- 글로 막 주절거리다 보니 낭패...

관련자료 첨부합니다~!

 

09_Arithmetic.pdf