C/C++ 에서 주로 사용하는 float형 부동 소수점에 대해 알아본다.
double형은 float형보다 지수부(exponent, 11 bit), 가수부(mantissa, 52 bit)의 길이와 그에 따라 값의 표현 범위가 더 넓을 뿐, 원리는 같으므로 생략.
아래 그림은 float형(32 bit)의 부동 소수점 표현 방식이다.
일반적으로 MSB(Most Significant Bit); 최상위 1 bit가 부호비트이다.
자, 이제 예를 들어 34.75 라는 실수가 부동 소수점 표현방식에 따라 어떻게 저장되는지 알아보자.
먼저 34.75라는 실수를 정수부분과 소수부로 분리하여 2진수로 표현해야 한다.
먼저 부호비트는 양수이므로 0이다.
정수: 34 (0010 0010)
소수: 0.75 (1100 0000 0000 0000 0000 000)
소수부를 이진수로 변환하는 방법은 아래와 같다.
0.75 x 2 = 1.5 --- 1
1.5 - 1.0 - 0.5
0.5 x 2 = 1.0 --- 1
1.0 - 1.0 = 0
0 x 2 = 0 --- 0
.
.
.
단순히 소수점에 계속해서 2를 곱하면서 1을 넘기면 1을 뺀 소수에 다시 2를 곱해나가는...
1을 넘기면 1, 넘기지 않으면 0으로 표현하면 된다.
따라서 34.75를 이진수로 변환하면 100010.1100 이 된다.
이를 부동소수점으로 저장하기 위해 정규화 과정을 거친다.
정규화란 정수부를 1로 두고, 적절하게 소수점 위치를 조정하는 것을 말하는데 위와 같은 경우
가 된다. 이에 따라 가수는 1.000101100, 지수는 5가 된다.
이때 지수 5를 이진수로 변환하면 0000 0101 이므로 이를 지수부에 저장하면 ... 안된다.
음수일 경우도 있기 때문에 지수부 공간(8 bit = 0 ~ 255)를 반으로 쪼개어 127을 중간 값으로 두고 계산을 해야 한다.
(단정도(32 bit) 부동 소수점 표현 방법에서 Bias 값이 127)
따라서 지수 0이 127을 의미하기 때문에 여기서는 127 + 5의 값으로 저장한다.
132를 이진수로 변환하면 1000 0100 이므로 지수부에 최종적으로 저장되는 값은 10000100이다.
가수부는 항상 1.xxxx로 표현되기 때문에 1. 을 제외한 나머지 부분을 그대로 가수부에 저장한다.
즉, 위의 예제에서 가수부에 저장되는 값은 000101100이다.
그러면 위 그림과 같이 값이 저장이 된다.
여기서 설정한 예제 값 (34.75) 의 가수는 운좋게 딱 맞아 떨어졌지만 무한소수로 빠지는 경우가 대부분인데,
이럴 경우 부동소수점 오차가 발생하게 된다.
'Programming > C, C++' 카테고리의 다른 글
Floating Point (C++ Source Example) (1) | 2018.09.10 |
---|---|
배열 (0) | 2017.12.11 |
데이터형에 관계없는 swap() 함수 (0) | 2017.12.11 |
void포인터, 함수 포인터 (0) | 2017.12.11 |
포인터의 포인터 (0) | 2017.12.11 |