본문 바로가기
Mathematics

부동소수점과 오차

by W00gie 2022. 2. 4.

일반적으로 컴퓨터는 10진수를 2진수로 변환하여 표기한다.하지만 컴퓨터 세계에서는 소수점을 상요할 수 없다. 대신 지수를 이용하여 이를 표기한다. 이러한 표현방식을 부동소수점을 이용한 실수표기라 한다. 이번 포스팅에서 부동소수점의 표기방법과 이로 인해 발생하는 오차에 대해 정리한다.


* 부동소수점

 

부동소수점수의 표기는 다음과 같은 구조로 이루어져 있다.

부호부 지수부 가수부

부호부는 일반적인 컴퓨터상의 부호 (음수,양수)를 표기하기 위한 비트부호와 같은 역할을 하는 1바이트의 영역이다.

그럼 지수부와 가수부는 어떤 영역일까? 실질적인 부동소수점 표기방법을 먼저 알아보도록한다.

실수를 부동소수점수로 표현하는 단계는 다음과 같다.

 

1. 실수를 정수부와 실수부로 나누어, 2진수로 변환한다.

ex) 10.625 = 1010 . 101

2. 2진수의 정수부가 1이 되도록 소수점의 위치를 이동한다.

1010.101 = > 1.010101

3. 소수점의 위치를 이동한만큼의 지수를 지수부에 기록한다.

    이동한거리 = 3

 

이러한 과정을 거쳐 부동소수점으로 실수가 저장되며, 부동소수점으로 저장된 수가 다시 실수로 변환될때에는

가수부에 저장되는 영역에 지수를 곱해주면된다. 2진수에서 지수의 원리를 감안하면 해당 수에서 2^n을 곱했을때 원래의 실수로 변환됨을 알 수 있다.

 


* 부동소수점으로 인한 오차

 

이러한 부동소수점을 저장하는 데이터형을 프로그래밍 언어에서는 2가지 제공한다.

  부호부 지수부 가수부 크기
단정도 부동소수점수 1 8 23 32bit
배정도 부동소수점수 1 11 52 64bit

이와 같이 지수부를 표기하는 영역에 한계가 있음을 알 수 있는데, 0.1과 같은 2진수로 무한히 표기되는 수를 해당 데이터형에 맞게 지수부를 끊으면 오차가 발생한다. 이러한 부동소수점으로 인한 오차는 아무리 성능이 좋은 컴퓨터여도 없앨 수 없다.

 

다만 이러한 부동 소수점으로 인한 오차를 줄이는 방법은 존재한다.

 실수를 계산할 때 오차가 발생하므로 실수를 계산하지 않는 방식이다. 대표적인 예로 0.1을 10번 더했을 때 1이 나오지 않는 문제를 해결하기 위해, 0.1의 소수점 위치를 한칸 이동해 1을 10번 더하고 해당 수에서 나온 결과인 10에서 다시 소수점을 왼쪽으로 한칸 이동 해 결과를 산출하는 방식이다.