고정 소수점 & 부동 소수점
컴퓨터에서의 실수 표현
컴퓨터에서는 실수를 2진수로만 표현해야 하기 때문에 정수에 비해서 표현하기가 훨씬 복잡하다.
이에 따라 실수를 표현하기 위한 여러가지 방법들이 연구되었으며, 지금 주로 사용하는 방식은 2가지이다.
- 고정 소수점(fixed point) 방식
- 부동 소수점(floating point) 방식
이진 기수법
컴퓨터는 0과 1로 이루어진 기계어를 사용한다. 사람들은 수를 표현할 때 기본적으로 10진법을 사용하는데, 컴퓨터에 이를 저장하려면 2진법으로 저장을 해야한다. 실수는 보통 정수부와 실수부, 이 2가지 부분으로 나눌 수 있다.
우선 정수 부분을 2진법으로 변환하는 법은 간단하다.
위의 사진처럼 정수 부분을 2로 계속 나누어주면 된다.
10진법 35는 2진법으로 바꾸게 되면 100011(2)가 되는 것이다.
소수 부분을 2진법으로 변환하는 법은 남은 숫자에 * 2를 해주는 방법이다.
0.625를 이진수로 변환해보자.
0.625 * 2 = 1.25 ==> 1을 빼내고 나머지 0.25
0.25 * 2 = 0.5 ==> 0을 빼내고 나머지 0.5
0.5 * 2 = 1.0 ==> 1을 빼내고 나머지 0
나머지가 0이 나오게 되면 변환을 종료한다.
0.625 ==> 0.101(2)이 되게 된다.
고정 소수점(fixed point) 방식
실수를 표현하는 가장 간단한 방식은 소수부의 자릿수를 미리 정하고 고정된 자릿수의 소수를 표현하는 것이다. 그 것이 바로 고정소수점 방식이다.
32비트 실수를 고정 소수점 방식으로 표현하면 위 사진과 같다.
앞에 부호비트 1개를 두고 정수부 15비트, 소수부 16비트를 두게 된다.
이 방식은 정수부와 소수부의 자릿수가 크지 않아서 표현할 수 있는 범위가 매우 적다는 단점이 있다.
부동 소수점(floating point) 방식
실수를 가수부와 지수부로 나누어 표현할 수도 있는데 이 방식이 부동 소수점 방식이다. 대부분의 시스템에서 부동 소수점 방식으로 실수를 표현하고 있다.
고정 소수점 방식은 표현할 수 있는 범위가 매우 작지만 부동 소수점 방식을 사용하게 되면 매우 큰 실수까지 표현가능하다.
32비트에서의 공식은 다음과 같다.
IEEE 부동 소수점 방식
현재는 대부분 IEEE 754 표준을 따르고 있다.
32비트인 float형 실수를 IEEE 부동 소수점 방식을 사용하여 표현하면 위 사진과 같다.
64비트인 double형 실수를 IEEE 부동 소수점 방식을 사용하여 표현하면 위 사진과 같다.
이제 -142.5625를 32비트 부동소수점으로 변환해보자.
- 부호부 지정하기 (음수 1, 양수 0)
- 숫자의 절댓값을 이진법으로 표현 (142.5625 ==> 10001110.1001)
- 소수점을 이동시켜 소수점 왼쪽에 1 한개만 남도록 변환 (10001110.1001 ==> 1.00011101001*2^{7})
- 소수점을 제거하고 가수부의 비트수에 맞춰 부족한만큼 0으로 채워 가수부 완성 (10001110100100000000000)
- 지수는 7이므로 bias에 7을 더해 이진법으로 표현하여 지수부 완성 (32비트에서 bias=127 ==> 10000110)
- 이 모든것을 이어붙이기 (1 10000110 10001110100100000000000)
tip
bias란 부호부를 가지지 않는 지수부가 음수가 되지 않도록 보정해주는 값 (32비트에서 지수부는 8자리 이므로 128에서 1을 뺀 127이 Bias가 된다.)
우리가 부동 소수점 방식에서 bias를 사용하는 이유는 지수가 음수가 될 수도 있기 때문이다.
예를 들어 1보다 작은 0.000101이라는 이진수를 사용하려고 하면 1.01*2^{-4}가 된다. -4를 저장하려고 부호부를 또 만들수는 없으므로 bias를 사용해야만 한다.
부동 소수점의 단점
- 아직 정밀도 문제가 존재하기 때문에 컴퓨터에서 실수를 다룰 때 연산이 오차를 가질 수 있다.
나올 수 있는 면접 질문
- 고정 소수점과 부동 소수점이란?
- 부동 소수점을 사용하여 10진수를 변환하는 방법은?
- bias를 사용하는 이유는?
참고 url
기여자
HelloNaks
📦