본문 바로가기
Base/CS

컴퓨터가 실수를 표현하는 방법 (고정소수점, 부동소수점, IEEE 754)

by joooing 2021. 6. 3.
반응형

언어

언어는 여러 사람들이 편하게 의사를 전하기 위해 생긴 수단이다. 같은 언어를 사용하는 사람들이 서로의 말을 이해하기 위해서는 같은 기호를 사용했을 때, 같은 뜻으로 받아들여야 한다. 사람이 사용하는 언어든 컴퓨터가 사용하는 언어든 모든 언어는 각 언어만의 기호로 이루어진다.

 

컴퓨터의 언어

컴퓨터의 언어는 기본적으로 2진수라는 방법을 사용해서 모든 기호를 나타낸다. 2진수는 어떤 기호를 오직 0 과 1 이라는 두가지 종류의 숫자로만 나타내는 방식이다. 선택지가 0, 1 두 가지이기 때문에 2진수 혹은 비트(bit = binary + digit)라고 부른다. 우리는 보통 0~9의 10가지 숫자를 가지고 다른 숫자를 나타낸다. 이 경우에는 선택지가 열 가지나 되기 때문에 10진수라고 부른다. 2진수, 10진수 외에도 8진수, 16진수 등 선택지의 개수에 따라 다양한 방식이 존재한다.

 

예를들어, 우리가 보통 말하는 100이라는 숫자를 각 방법으로 변환하면 2진수에서는 1100100, 8진수에서는 144, 10진수에서는 100, 16진수에서는 64가 된다. 전혀 다른 모양으로 변환이 되는데, 변환 방법에 대한 자세한 이야기는 다른 글에서 다루고 이번 글에서는 이 중에서도 2진법으로 실수를 표현하는 방법에 대해서만 다루어보려고 한다. 

 

컴퓨터가 실수를 표현하는 방법

실수를 표현하는 방법은 정수를 표현할 때 보다도 훨씬 복잡하다. 예를들어 -2.15 라는 실수를 표현하기 위해서는 부호(-), 정수부(2), 소수부(0.15) 세 가지의 요소가 필요하다. 이렇게 고려할 사항이 많은 실수를 표현하기 위해 다양한 방법들이 연구되어 왔는데 현재 가장 많이 사용하는 대표적인 방식에는 '고정 소수점(fixed point) 방식'과 '부동 소수점(floating point) 방식'이 있다. 하나씩 알아보도록 하자.

 

출처 :  http://tcpschool.com/codingmath/real

 

1.  고정 소수점 표현법

고정 소수점 표현법은 이름처럼 소수점의 위치를 고정시켜두는 방법이다. 다시말해, 어떤 정수를 표시하는데 얼만큼의 크기를 사용할지, 소수를 표시하는 데에는 얼만큼의 크기를 사용할지를 미리 정해두고, 그 사이에 소수점을 찍어두는 것이다. 예를 들어, 32비트의 실수를 고정 소수점 방식으로 표현하면 아래처럼 표현할 수 있다.

하지만 크기가 미리 정해지다보니 굳이 모든 공간이 필요하지 않은 경우에는 낭비가 발생하기도 하고, 범용성이 떨어지기도 한다. 정수, 소수가 각각 몇 자리씩만 표현될 수 있다고 정해져 있어서 각각이 표현할 수 있는 범위도 한정적이다. 따라서 아주 작은 수나 아주 큰 수를 표현하기에는 부적합하기도 하다. 그래서 현재 대부분의 컴퓨터에서는 고정 소수점 방식을 잘 사용하지는 않고, 특별한 목적에 쓰이는 일부의 컴퓨터에서 이 방식을 사용한다고 한다.

 

2.  부동 소수점 표현법

이번에는 대부분의 시스템에서 사용하는 부동 소수점 방식에 대해 살펴보도록 하자. 앞서 보았던 방식에서는 실수를 정수부, 소수부로 나누어 표현는데, 이 방식 말고도 아래처럼 표현할 수도 있다. 바로 지수부, 가수부로 나누는 방식인데, 부동 소수점은 이 방식을 활용해 실수를 표현한다. 아래 그림만 봐도 소수점의 위치가 왼쪽으로 갔다가 오른쪽으로 갔다가 자유롭게 이동하는 것을 볼 수 있다.

 

 

이렇게 표현을 하게되면 정수부와 소수부의 크기가 미리 정해져있지 않아 훨씬 다양한 표현을 할 수 있게 된다. 즉, 표현할 수 있는 수의 범위가 넓어지게 되는 것이다.

 

하지만 위의 123.456의 예시처럼 한 가지 숫자를 다양하게 표현할 수 있다는 점이 한편으로는 표현법이 중복된다는 이야기이기 때문에 비효율적이기도 하고, 오차가 발생할 수 있어 정확도가 떨어질 수 있다는 단점이 있기도 하다. 또 지수가 커질수록, 가수 패턴 사이의 값 차이가 커져서 표현 불가능한 패턴이 점점 많아질 수 있다는 문제도 있다.

 

이처럼 부동 소수점은 크기가 제한된 메모리 공간에서 표현할 수 있는 수의 범위를 늘리기 위해 사용하지만, 대신 정확도는 떨어질 수 있다. IEEE(미국 전자전기 공학회)에서는 부동소수점 연산에서의 낭비를 최소화하고, 같은 비트를 쓰더라도 최대한 정확하게, 정밀도 높게 하기 위해 IEEE 754라는 표준을 정해두기도 했다. 이 표준에 대해서도 살펴보도록 하자.

 

 

3.  IEEE 754

IEEE 754는 부동 소수점 연산에 대한 표준이다. 이 표준이 어떻게 연산의 낭비를 줄이고 정확도를 높인다는 것일까? 가수를 조정해서 맨 앞에 0이 오지 않게 만드는 정규화 방식을 사용하거나, 가수의 맨 왼쪽에는 무조건 1이 올것이기 때문에 이를 생략하고, 다른 부분에 생략한 만큼의 공간을 더 사용하는 방식을 사용하기도 한다. 일단 가장 많이 쓰이는 두 가지 부동소수점 형식에 대해 알아보도록 하자. 기본정밀도(Single precision) 부동소수점수와, 2배정밀도(Double precision) 부동소수점 수 형식이다.

 

기본정밀도 형식 (Single precision)

우선 기본정밀도 형식은 32비트의 크기를 사용한다. 이 32비트 중 부호에 1비트, 지수부에 8비트, 가수부에 23비트를 사용한다. 프로그래밍 언어 중 다수의 4byte float 형식이 이 방식을 사용하고 있다.

2배정밀도 형식 (Double precision)

2배정밀도 형식은 기본의 두배인 64비트의 크기를 사용한다. 이 중 부호에 1비트, 지수에 11비트, 가수부에 52비트를 사용한다. 지수부 같은 경우에는 기본정밀도형식보다 3비트가 더 큰데, 이 말은 결국 2^3 = 8배의 범위 수를 표현할 수 있다는 것이다. 가수부는 기본정밀도형식보다 29비트가 더 커서 2^29 배 많은 수들을 표현할 수 있다. 비록 기본형식보다 두배나 많은 크기를 사용하지만, 표현할 수 있는 범위가 훨씬 크기 때문에 정확성을 높일 수 있다는 장점이 있다.

 

부동소수점 방식은 고정소수점 방식보다 훨씬 더 많은 범위를 표현할 수 있지만, 그럼에도 10진수를 정확하게 표현하지는 못하기 때문에 항상 오차가 존재할 수 밖에 없다. 이 점을 항상 염두해두고, 상황에 따라 적절한 정밀도의 자료형을 선택해야 한다.

반응형

댓글