- 컴퓨터가 실수를 저장하는 방식: fixed point vs. floating point

 

십진수 실수를 이진수 실수로 표현하는 방식에는 fixed point 방식과 floating point 방식이 있습니다.

 

예를 들어 십진수 +5.5는 fixed point 이진수로 나타내면 +101.1 이고 floating point 이진수로 나타내면 +1.011*(2^2) 입니다.

 

또다른 예로 십진수 -10.25는 fixed point 이진수로 -1010.01 이고 floating point 이진수로 -1.01001*(2^3) 입니다.

 

컴퓨터가 이런 이진수 실수를 저장할 때는 꼭 필요한 정보만을 저장하는데요.

 

fixed point 이진수를 저장할 때는 부호, 정수 부분, 소수 부분 총 3가지를 저장합니다.

 

예를 들어 fixed point 이진수 +101.1의 경우 부호 +, 정수 부분 101, 소수 부분 1을 저장합니다.

 

마찬가지로 fixed point 이진수 -1010.01의 경우 부호 -, 정수 부분 1010, 소수 부분 01이 저장합니다.

 

fixed point 이진수의 정수 부분과 달리 floting point 이진수의 정수 부분은 항상 1이기 때문에 정수 부분의 값을 저장 할 필요가 없습니다.

 

대신 floating point 이진수는 fixed point와는 달리 2^n 값이 곱해지기 때문에 지수 부분 n 값을 저장해주어 야 합니다.

 

따라서 floating point 이진수는 부호, 지수 부분, 소수 부분 총 3가지를 저장합니다.

 

예를 들어 floating point 이진수 +1.011*(2^2)의 경우 부호 +, 지수 부분 2, 소수 부분 011을 저장합니다.

 

마찬가지로 floating point 이진수 -1.01001*(2^3)의 경우 부호 -, 지수 부분 3, 소수 부분 01001을 저장합니다.

 

정리하면 fixed point 이진수와 floating point 이진수는 컴퓨터에서 아래 표와 같이 3부분으로 저장합니다.

 

Signed fixed point format과 unsigned floating point format

 

- bit precision

 

컴퓨터가 저장한 실수 정확도는 컴퓨터가 소수 부분을 저장하기 위해 사용하는 bit 수에 의해 결정됩니다.

 

예를 들어 아래 표와 같이 5자리 이진수 소수부분은 십진수 소수부분 1자리인 0.1~0.9를 정확히 표현 할 수 있지만 십진수 소수부분 2번째 자리 범위인 0.01~0.09은 정확히 표현 할 수 없습니다.

 

이진수 소수부분과 십진수 소수부분 관계

만약 십진수 소수부분 2자리 0.01~0.99 범위의 값을 정확히 표현하고 싶다면 이진수 소수부분 7자리를 사용해야 합니다.

 

이처럼 십진수 소수부분의 정확도는 컴퓨터가 이진수 소수부분을 저장하기 위해 사용하는 bit 사이즈에 영향을 받습니다.

 

컴퓨터 공학에서는 이진수 소수부분을 저장하기 위해 사용하는 bit 사이즈를 bit precision이라고 부릅니다.

 

위의 예시 처럼 이진수 소수부분을 저장하기 위해 5자리를 사용할 경우 bit precision은 5bit가 되고 7자리를 사용할 경우 bit precision은 7bit가 되는 것입니다.

 

이 bit precision N과 표현할 수 있는 십진수 소수부분 자리수 M의 관계를 공식으로 나타내면 아래와 같습니다.

 

M = log(2^N)

 

bit precision 5bit는 공식에 의해 log(2^5) = 1.x 이므로 십진수 1자리를 정확히 표현할 수 있습니다.

 

bit precision 7bit는 공식에 의해 log(2^7) = 2.x 이므로 십진수 2자리를 정확히 표현할 수 있습니다.

 

위의 예시를 통해 볼 수 있듯이 bit precision N값에 따라 표현 할 수 있는 십진수 자리수가 결정되기 때문에 bit precision 이 클수록 십진수를 좀 더 정확히 표현 할 수 있게 됩니다.

- 십진수와 이진수 그리고 정수와 실수

 

우리는 실생활에서 십진수을 사용하지만 컴퓨터는 하드웨어적 특성상 이진수를 사용합니다.

 

정수의 경우에는 우리가 사용하는 십진수와 정확히 일치하는 이진수를 표현할 수 있기 때문에 문제가 되지 않습니다.

 

즉, C에서 int 형 변수는 우리가 사용하는 십진수를 오차 없이 저장 할 수 있습니다.

 

예를 들어 십진수 3은 이진수 101로 변환돼 저장되고 십진수 8은 이진수 1000으로 변환돼 저장됩니다.

 

반면 실수의 경우에는 우리가 사용하는 십진수 값들을 이진수로 정확히 표현하지 못하는 경우가 많습니다.

 

예를 들어 십진수 0.2는 이진수로 정확히 표현 할 수 없고 소수점 아래 5자리(컴퓨터에서는 자리를 bit라고 표현합니다.)를 사용해서 최대한 가깝게 이진수로 표현하면 0.00110으로 표현 할 수 있습니다.

 

즉, C에서 float, double과 값은 실수형 변수들은 십진수 실수값과 최대한 가까운 이진수 실수값으로 저장하게 됩니다.

 

아래 표는 십진수 정수 0~10을 이진수로 변환한 값과, 십진수 실수 0.1~0.9를 이진수 5bit를 사용해서 최대한 가깝게 변환한 값을 나타낸 표입니다.

 

십진수와 이진수의 관계

 

표에서도 확인 할 수 있듯이, 십진수 0.1~0.9는 이진수로 변환되면서 오차가 생기게 됩니다.

 

예를 들어 십진수 0.1은 이진수 0.00011로 변환되고 이 이진수는 십진수 값으로 0.09375이기 때문에 실제 0.1과 차이가 있습니다.

 

이처럼 컴퓨터가 처리하는 이진수 실수 값들은 필연적으로 오차를 수반하게 됩니다.

- C/C++에서 float 형 변수와 double 형 변수의 차이

 

실제 C에서 float 형 변수와 double 형 변수는 실수값을 floating point 이진수 방식으로 저장합니다.

 

즉, float 형 변수와 double 형 변수 모두 실수 값을 저장하기 위해 부호, 지수 부분, 소수 부분을 저장합니다.

 

차이는 float 형 변수와 double 형 변수가 실수값을 저장하기 위해 사용하는 메모리 bit 사이즈에 있습니다.

 

즉, float 형 변수는 실수값을 저장하기 위해 32bit(부호 1bit, 지수 부분 8bit, 소수 부분 23bit)를 사용하고 double 형 변수는 실수값을 저장하기 위해 64bit(부호 1bit, 지수 부분 11bit 소수 부분 52bit)를 사용합니다.

 

이는 구체적으로 두가지 차이로 볼 수 있는데요.

 

먼저 float 형 변수와 double 형 변수의 지수 부분 bit 사이즈의 차이로 인해 저장할 수 있는 실수값의 범위가 달라집니다.

 

float 형 변수와 double 형 변수는 지수 부분을 저장하기 위해 각각 8bit, 11bit를 사용하는데요.

 

float 형 변수는 8bit로 지수부분 -127~128을 표현하는데 사용하고, double 형 변수는 11bit로 -1023~1024를 표현하는데 사용합니다.

 

따라서 float 형 변수는 저장할 수 있는 값의 범위가 대략 -(2^128) ~ +(2^128) 이고

double 형 변수는 저장할 수 있는 값의 범위가 대력 -(2^1024)~+(2^1024) 입니다.

 

다음으로 float 형 변수와 double 형 변수의 소수 부분 bit 사이즈의 차이로 인해 정확히 표현 할 수 있는 실수값의 자리수가 달라집니다.

 

float 형 변수의 경우 생략된 정수부분 1bit와 소수부분 23bit로 인해 bit precision이 24bit이고, double 형 변수의 경우 생략된 정수부분 1bit와 소수부분 52bit로 인해 bit precision이 53bit가 됩니다.

 

따라서 float 형 변수는 log(2^24)=7.x 공식에 따라 십진수 7자리 숫자를 정확히 표현할 수 있고 double 형 변수는 log(2^53)=15.x 공식에 따라 십진수 15자리 숫자를 정확히 표현할 수 있습니다.

 

위의 두가지 차이를 통해서 float 형 변수는 double 형 변수 보다 지수부분 bit 사이즈가 작아서 저장할 수 있는 값의 범위가 더 작고 bit precision이 더 낮아서 저장된 숫자의 정확도가 더 떨어 짐을 알 수 있습니다.

+ Recent posts