# 실수의 저장 원리

## 실수의 저장 원리

이 문서에서는 실수(부동소수점수)의 저장 원리에 대해서 살펴본다.\
이 문서는 위키백과를 참고하였.

* [위키백과 : 부동소수점수(IEEE 754)](https://ko.wikipedia.org/wiki/IEEE_754)
* [위키백과 : 부동소수점](https://ko.wikipedia.org/wiki/%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90)

### 표현 방식

실수는 크게 다음 두 가지의 표현 방식을 가질 수 있다.

* 고정 소수점 방식(Fixed Point)
* 부동 소수점 방식(Floating Point)

#### 고정 소수점 방식

![그림출처 : https://hoodymong.tistory.com/50](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-MdHcmhEgqBzK_ZdOtQ5%2F-MdHdEtbqwew12-kJw4n%2Fimage.png?alt=media\&token=5dfbba9f-46ce-4900-82b3-68ceddf79c5b)

고정 소수점 방식은 우리가 일반적으로 표기하는 것처럼 소수점을 기준으로 `정수`와 `소수` 부분으로 나누어 표기하는 방식이다. 자리가 고정되어 있기 때문에 표시할 수 있는 숫자의 범위가 제한적이며, 정밀해질 수록 오차가 발생한다.

#### 부동 소수점 방식

![그림출처 : https://hoodymong.tistory.com/50](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-MdHcmhEgqBzK_ZdOtQ5%2F-MdHdNro7HR6BRZQqDF-%2Fimage.png?alt=media\&token=e6f61128-0a33-47f3-8834-052b460c1384)

부동 소수점 방식은 고정 소수점 방식의 문제점인 유연성을 해소하기 위한 형태이며, 지수부와 가수부로 구분하여 표기하는 방식이다. 자세한 방식은 윗부분의 위키백과에서 확인할 수 있으므로 대략적으로 이해를 돕기 위한 설명만 진행한다. 설명은 10진수로 진행한다.

```
12345.6789
```

위와 같은 숫자가 있다고 가정하면 고정 소수점 방식에서는 다음과 같이 저장한다.

* 부호 : 0
* 정수 : 12345
* 소수 : 6789

부동 소수점 방식에서는 다음과 같이 저장한다.

* 부호 : 0
* 지수 : 10000
* 가수 : 123456789

지수는 원래 숫자에서 정수부를 한 자리만 두도록 변경한 뒤 곱해야 하는 숫자를 말하며, 가수는 소수점을 제거한 숫자 전체를 말한다. 즉, 가수와 지수를 합쳐 원래 숫자를 만들어낼 수 있다.

* 가수가 123456789이고 지수가 10000이므로 원래 숫자는 `1.23456789 * 10000` = `12345.6789`

고정소수점보다는 좀 더 넓은 범위를 표현할 수 있지만, 여전히 문제가 되는 정밀도는 해결이 불가능하다.\
자바에서는 4바이트 실수인 float가 약 6자리, 8byte인 double이 약 15자리의 소수부를 표시할 수 있다.

* float : 부호(1) + 지수(8) + 가수(23) = 32bit
* double : 부호(1) + 지수(11) + 가수(52) = 64bit
