Floating Point 에 대해 알아보기전 이해를 돕기 위하여
Fixed Point 에 대해서 알아보도록 하자.
Fixed Point 란 소수점의 위치가 고정인 것을 의미하는데
123.456 이라는 수를 표현할 경우 정수 부분과 소수부분을 나누어 표현한다.
이때 한정된 비트에 정수와 소수를 분할 배치할 경우 나타낼 수 있는 범위가 매우 한정적인데 소수점의 위치가 고정이 아니라면 어떻게 될까 ?
123456 이라는 유효숫자와 3이라는 소수점 위치를 통해서 훨씬 많은 범위의 수를 표현할 수 있게 된다.
이렇게 나온 방식이 바로 Floating Point 이다.
Fixed Point | 고정 소수점
Floating Point | 부동 소수점
정수와 같은 경우 2의 보수법을 통하여 2진법으로 BitState 가 될 수 있는데 소수는 어떻게 2진법으로 표현하는 걸까 ?
Floating Point 를 제대로 이해하기 위해서는 실수를 2진법으로 표현하는 방법을 알고 있어야 한다.
예시를 들어 -9.6875 를 2진법으로 나타낸다 하였을 때
부호 , 정수 , 소수로 나누어 생각한다.
부호 - 정수 9 < 1001(2) > 소수 6875 -1001.1011(2) 의 구조
위와 같이 부호는 음수이며 정수 9를 2진수로 1001 로 쉽게 변화할 수 있는데 소수부분을 어떻게 해결할까 ?
정수의 반대로 생각하여 구하면 쉬워진다.
정수와 같은 경우 다음과 같이 2진법을 사용할 수 있다.
9 / 2 = 4 ... 1
4 / 2 = 2 ... 0
2 / 2 = 1 ... 0
1 / 2 = 0 ... 1
이처럼 나머지를 구하여 1001 이라는 표현으로 2진수로 구하지 않았는가 ?이와 같이 소수는 반대로 2를 곱하여 정수부분을 취한다.
0.6875 * 2 = 1.375
0.375 ... 1
0.375 * 2 = 0.75 ... 0
0.75 * 2 = 1.5
0.5 ... 1
0.5 * 2 = 1.0 ... 1
이 처럼 정수부분을 모두 취한 소수부분의 2진수는 1011 이 나오게 되며
-9.6875 의 2진수 표현은 -1001.1011(2) 로 나오게 된다.
위와 같은 경우에는 최종결과가 0.0이 나와 멈출 수 있지만
보통 대부분의 실수는 무한히 순환하면서 반복되어 적당한 개수의 유효숫자만을 취하게 된다.
Binary System | 2진법
Real Number | 실수
이제 앞서 예를 들었던 -1001.1011(2) 을 이용하여 부동 소수점의 구조를
알아보도록 하자.
부동소수점으로 저장하기 위해선 정규화 과정을 거쳐야 하는데
지수를 이용하여 실수를 표현한다.
-1001.1011 은 -1.0011011 * 2^3 이 되는데
여기에서 정규화란 정수부를 1로 맞추어 놓고 적절하게 소수점 위치를 조정하는 것이다.
이 때 정규화를 거친 소수부의 유효 숫자를 가수부 , 지수를 지수부로 나누어 부동 소수점을 표시한다.
부호부 - 지수부 3 가수부 0011011 -1.0011011 * 2^3 의 구조
위와 같이 보호부 지수부 가수부로 나누어 Bit 로 변환하게 되는데
이때 해당 부분들이 얼마 만큼의 Bit 가 사용하는 지 알아보자.
자료형 부호부 지수부 가수부 총 Bit float 1 Bit 8Bit 23Bit 32 Bit double 1 Bit 11Bit 52Bit 64 Bit 이제 위의 표를 가지고 BitState 로 변환하여 보자
부호부는 간단한데 양수면 0 , 음수면 1이다.가수부 같은 경우엔 변환된 가수부를 왼쪽 부터 그대로 채우게 된다.
지수부와 같은 경우 8 bit 로 -127 ~ 128 까지의 256 단계를 나타내는데
이때 오해할 수 있는 것이 2의 보수를 취하여 표현하여 저장한다라고 생각 할 수 있지만 그렇지 않다.
지수부 8 bit 가 모두 0 으로 채워진 [ 0000 , 0000 ] 은 -127 을 나타내고 1 증가한 [0000, 0001] 은 - 126 을 나타낸다.
이렇게 하여 모두 [ 1111 , 1111 ] 은 128 을 나타나게 된다.
이러한 방식을 바이어스 표현법이라 한다.이렇게 하여 -9.6875 를 BitState 로 저장하게 된다면
부호부 : 1
지수부 : 1000,0010 ( 참고 : 1000,0000 부터가 1이다. )
가수부 : 0011011000...0
으로 표현하여 저장하게 된다.
위에서 어째서 불필요한 바이어스 표현법을 사용할까 ?
라는 의구심이 생길수가 있다.
Bias 와 같은 경우 순수한 0 과 INF 를 표현하기 위해 사용한다.실상 우리가 아는 컴퓨터의 0 의 표현법은 모든 메모리의 bit 가 0 으로 채워져 있을 때를 0 이라 가정한다.
실수의 모든 bit 가 0이라 채워져 있을 때를 가정하여 2의 보수를 취해 계산을 하게 된다면 + 1.00000...0 * 2^0 = 1 이 되어버린다.
이처럼 모든 bit 를 0 으로 채워버리면 기본값이 1이 되어버리는 경우가 발생한다.바이어스 표현법을 사용하여 표현하게 된다면
1.0000..0 2 ^ -127 이 되며 이것은
1 / 2^127 이라는 아주 작은 수를 표현하게 된다.
이 또한 0 이 아닌데 만일 이 값을 0으로 지정하게 된다하면 이보다 작은 양수를 표현할 수 없게 되어 버린다.
이때 특별한 규정을 두었는데 지수부가 모두 0으로 채워진 경우에 유효숫자의 정수부가 1 이 아닌 0이 되도록 하였으며 그에 맞추어 지수를 -127 이 아닌 -126 으로 고정하였다.