1. 고정소수점 (Fixed Point)
고전소수점은 소수점 이상, 이하를 특정 비트로 딱 나눠서 처리하는 방법이다. 만약 반반씩하기로 하면 4바이트에서는 앞 2바이트는 가수부, 뒤 2바이트는 소수부로 표현하는 방식이다. 예를들어 12.34를 저장한다고 하고 각각 정수부와 실수부에 1바이트씩 할당한다고 하면 12는 0000 1100이 되고, .34는 계속 x2를 하면 0101 0111이 된다. 최종적으로 값은 0000 1100 0101 0111이 되고 2바이트(1:1)의 Fixed Point 표현법이 된다.
2. 부동소수점 (Float Point)
그렇다면 부동소수점은 소수비트와 가수비트가 알아서 유동적으로 변할까?라고 하면 그건 아니다. 부동소수점 방식은 IEEE에서 지정한 IEEE754방식을 따르는 것이라고 할 수 있다. 보통 우리가 컴퓨터에서 실수형 자료를 쓸 때는 이 부동소수점 방식을 따른다. 부동 소수점이라고 부르는 이유는 표기를 할 때 $1234.567$과 같이 표현하지 않고, $1.234567 \times 10^3$과 같이 표현하기 때문이다. 즉, 소수점이 앞쪽으로 이동해서 부동(떠올라서 움직이는)소수점이다.
IEEE754는 기본적으로 부호비트, 지수비트, 가수비트로 나뉜다. 그리고 각 비트에 대한 자세한 포맷은 아래와 같다.
1) 32Bit (단정도, Single-Precision) : 1 + 8 + 23
2) 64Bit (배정도, Double-Precision) : 1 + 11 + 52
3) 80Bit (확장형, Extended-Precision) : 1 + 11 +68
3. 예시
예시(-170.625)를 통해 IEEE754방법을 배워보자.
(1) 부호비트 체크 = 1
음수이기 때문에 1 (양수는 0)
(2) 가수부 자연수 계산 = 10101010
170 = 85 x 2 + 0
85 = 42 x 2 + 1
42 = 21 x 2 + 0
21 = 10 x 2 + 1
10 = 5 x 2 + 0
5 = 2 x 2 + 1
2 = 2 x 1 + 0
1 = 2 x 0 + 1
(아래부터 읽기)
(3) 소수부 계산 = .101
0.625 x 2 = 0.25 + 1
0.25 x 2 = 0.5 + 0
0.5 x 2 = 0.0 + 1
(위부터 읽기)
(3) 정규화 (Normalization)
$-10101010.101 = -1.0101010101 \times 2^7$
부호 : 1
지수 : 7
가수 : -1.0101010101
(4) 지수부 바이어스 계산 (Add Bias) = 134
32Bit 계산에서는 지수부에 8Bit를 할당한다. 본래 8Bit에서 2의보수를 사용하지 않으면 +0과 -0이 모두 존재해서 -127 ~ 127까지 표현할 수 있다. 여기에서는 부호표현을 MSB, LSB, 보수 등을 이용하지 않고 -127을 0000 0000으로, +127을 1111 1111로 쓰기로 정의한다. 때문에 지수에 127을 더해준다. (음수의 경우 (-5) + 127 이런식으로) 7 +127은 134이고 2진수로 1000 0110이다.
(5) 가수부는 1제거하고 소수만 (Only Decimal)
저런방식으로 표기하면 가수부 앞은 반드시 1이다. $1.??? \times 2^n$처럼 표기하기 때문이다. 그래서 가수부의 1은 생략하고 소수점 부분인 .0101010101만 남긴다. (이로써 1비트를 아낄 수 있다) 또한 23자리를 채워야하니 뒷부분을 모두 0으로 맞춰준다.
(5) 최종표현
= 부호(1) , 지수(1000 0110) , 가수(0101 0101 0100 0000 0000 000)
4. 부동소수점이 약간 부정확한 이유
가끔 300.0을 저장했는데 출력하면 300.000000007과 같이 출력될 때가 있다. 그 이유는 실수를 IEEE754 방식으로 저장할때 소수부를 저장할 때, 계속해서 2를 곱해나가는데, 원래 가수부였던 부분이 지수표현으로 인해 소수로 내려가서 이러한 결과가 발생하는 것이다.
1) 부호 비트 체크
= 0
2) 가수부 절대값 변환
= 100111100
300 = 150 x 2 + 0
150 = 75 x 2 +0
75 = 37 x 2 + 1
37 = 18 x 2 + 1
18 = 9 x 2 + 1
9 = 4 x 2 + 1
4 = 2 x 2 + 0
2 = 2 x 1 + 0
1 = 2 x 0 + 1
3) 소수부 변환
= .0
4) 정규화 (Normalization
$100111100.0 = 1.001111000 \times 2^8$
지수 : 8
가수 : 1.001111000
4) 지수 바이어스 계산
8 + 127 = 135
= 1000 0111
5) 가수부 1제거
= .001111000
6) 최종결과
0 1000 0111 0011 1100 0000 0000 0000 000 (소수부가 생김)
5. Reference
[IEEE 754] 부동소수점과 바이어스 표현법
컴퓨터에서 실수를 표현하기 위해 사용하는 방법 IEEE 754(32bit), 부호부 1bit 지수부 8bit 가수부 나머지bit ----------------------------------------------------------------------------------------------..
infosul.tistory.com
IEEE 754
IEEE 754는 컴퓨터에서 소숫점을 표현하기 위한 방법이다. single precision은 32비트 즉 1워드에 저장...
blog.naver.com
'알고리즘' 카테고리의 다른 글
문자열 알고리즘 (1) - 부르트 포스 (Brute Force, Naive Search) (0) | 2020.02.19 |
---|---|
단순 자료구조 (4) - 문자열 (String) (0) | 2020.02.18 |
단순 자료구조 (3) - 문자 (Character) (0) | 2020.02.18 |
단순 자료구조 (1) - 정수 (Integer) (0) | 2020.02.18 |
자료구조의 분류 (0) | 2020.02.18 |
검색 (5) - 내분 검색 (Interpolation Search) (0) | 2020.02.15 |
검색 (4) - 이진 검색 (Binary Search) (0) | 2020.02.15 |