본문 바로가기

카테고리 없음

부동소수점의 이해 및 정수 정확도 보장 범위

float, double을 이해해보자.

 

부동 소수점은 소주점의 위치가 고정되어 있지 않고 지수와 가수로 수를 표현하는 방식이다.

 

float라는 이름은 부동소수점 (float point)을 줄인 이름이다. double은 정확도가 float보다 대충 두배가 높아서.

 

이제 핵심인 지수와 가수 개념을 알아본다.

 

(아래는 double을 기준으로)

 

double의 구조를 살펴보면 64비트로 되어있는데

 

| 부호(1) | 지수(11) | 가수(52) | 이렇게 되어있다.

 

의미를 보면

 

부호 비트(S): 1비트 → 0이면 양수, 1이면 음수

지수(E): 11비트 → 지수(exponent)를 저장, bias = 1023

가수(M): 52비트 → 소수점 이하의 유효 숫자

 

이를 바탕으로 값을 계산하는 방법은

 

값(실수) = (-1)^S × (1.M) × 2^(E - bias(1023))

 

여기서 내가 생각하기에 이해의 핵심은 가수 부분이다.

 

M은 52비트 1.M이라고 써놨지만 매우 헷갈렸다.

 

M의 이해를 M의 비트를 정수로 바꾸어 뒤에 붙여주는 것이 아니라 음의 지수 이진법으로 생각해야한다.

 

예를 들어 M의 비트가 1000... 이면 1/2이고 1100... 이면 1/2 + 1/4가 된다.

 

(1.M) 은 1M(1)M(2)M(3)...M(52) 이렇게 이루어지는것 인데 계산은

 

M(k)가 0이면 0 M(k)가 1이면 2^(-k)를 더해주는식으로 계산한다.

 

이해가 됐으면 double의 정수 정확도는 2^53까지인 것을 이해할 수 있게 된다.

 

지수의 범위가 2^-1023~2^1025니까 

 

가수부분에 지수를 조절하면 이진법으로 바꿔서 정수를 나타낼 수 있다. 즉 0~2^53까지 1씩 증가가 가능하다.

 

그 이후 부분은 정확도가 보장되지 않는다. 가수가 모잘라서.

 

 

예시 계산

 

(double)1.0 = 0 | 01111111111 | 0000000000000000000000000000000000000000000000000000

 S = 0

E = 1023

M=0

-> (-1)^0× (1.0) × 2^(0)

-> 1

 

(double)54.0 = 0 | 10000000100 | 1011000000000000000000000000000000000000000000000000

 

S = 0

E = 1028

M = 1/2+1/8+1/16

-> (-1)^0× (1.6875) × 2^(5)

 

1.6875 * 32 -> 54 (이런식으로 계산하지말고)

 

1.6875이걸 이진수로 보면

 

1.1011 이렇게 볼수 있는데 2^5만큼 옮기면

110110 이런 바이너리로 볼 수 있다. 이걸 decimal로 바꾸면 54가 나온다.

 

 

 

이 글을 gpt 돌려서 아래에 붙인다..

 

 


float, double 그리고 부동소수점 이해하기

부동소수점(floating point)은 소수점 위치가 고정되어 있지 않고, 지수와 가수로 실수를 표현하는 방식이다.

float라는 이름은 부동소수점(floating point)을 줄인 말이고, double은 float보다 대략 두 배 정도 더 높은 정밀도를 가진 부동소수점 자료형이다.


부동소수점의 핵심 — 지수와 가수

이제 핵심인 지수(exponent)와 가수(mantissa, fraction) 개념을 double 기준으로 살펴보자.

double은 64비트(8바이트)로 구성되어 있는데, 크게 세 부분으로 나뉜다.

| 부호(1비트) | 지수(11비트) | 가수(52비트) |

  • 부호 비트(S): 1비트. 0이면 양수, 1이면 음수이다.
  • 지수(E): 11비트. 실제 지수를 저장하는데, bias라는 값을 1023만큼 더해 저장한다.
  • 가수(M): 52비트. 소수점 아래의 유효 숫자를 표현한다.

실제 값 계산 방법

부동소수점 실수 값은 다음 공식으로 계산한다.

값=(−1)S×(1.M)×2(E−1023)\text{값} = (-1)^S \times (1.M) \times 2^{(E - 1023)}

  • 여기서 1.M은 숨겨진 1(hidden bit)와 가수 M을 합친 값이다.
  • E - 1023은 실제 지수 값이다.

가수(M)의 정확한 의미

여기서 핵심이 바로 가수 부분(M) 이다.

M은 52비트로 되어 있는데, 단순히 이진수 정수처럼 뒤에 붙여서 계산하는 것이 아니다.

가수는 소수점 아래 자리이기 때문에, 각 비트는 1/2, 1/4, 1/8, ... 형태로 음의 지수 이진법으로 해석해야 한다.

예를 들어,

  • M이 1000...0 이면, 12\frac{1}{2}
  • M이 1100...0 이면, 12+14=0.75\frac{1}{2} + \frac{1}{4} = 0.75

즉,

1.M=1+∑k=152Mk×2−k1.M = 1 + \sum_{k=1}^{52} M_k \times 2^{-k}

여기서 MkM_k는 가수의 각 비트 (0 또는 1)이다.


double의 정수 정확도

이 때문에 double은 2532^{53}까지의 정수를 정확하게 표현할 수 있다.

  • 가수가 52비트이고, 숨겨진 1비트가 있기 때문에 유효 숫자가 53비트다.
  • 지수의 범위는 대략 2−10222^{-1022}부터 210232^{1023}까지이다.
  • 따라서 0부터 2532^{53}까지는 1씩 정확히 증가하는 정수값을 표현 가능하지만, 그 이상부터는 가수 비트가 부족해져 정확도가 떨어진다.

예시 계산

(double) 1.0

이진 표현:

0 01111111111 (1023) 0000000000000000000000000000000000000000000000000000

부호 지수 (11비트) 가수 (52비트)

  • S=0S = 0
  • E=1023E = 1023
  • M=0M = 0

값 계산:

(−1)0×(1+0)×21023−1023=1.0(-1)^0 \times (1 + 0) \times 2^{1023 - 1023} = 1.0


(double) 54.0

이진 표현:

0 10000000100 (1028) 1011000000000000000000000000000000000000000000000000

부호 지수 (11비트) 가수 (52비트)

  • S=0S = 0
  • E=1028E = 1028
  • M=1/2+1/8+1/16=0.6875M = 1/2 + 1/8 + 1/16 = 0.6875

값 계산:

(−1)0×(1+0.6875)×21028−1023=1.6875×25(-1)^0 \times (1 + 0.6875) \times 2^{1028 - 1023} = 1.6875 \times 2^{5}

이 값을 보면,

  • 1.68751.6875를 이진수로 보면 1.1011 (1 + 1/2 + 0 + 1/8 + 1/16)
  • 이 값을 25=322^{5} = 32 만큼 이동시키면 이진수 110110가 되고,
  • 이진수 110110는 10진수로 54가 된다.

정리

  • float과 double은 모두 부동소수점 방식으로 실수를 표현한다.
  • double은 64비트로 부호, 지수, 가수로 나뉘며, 지수는 bias(1023)를 빼서 실제 지수를 얻는다.
  • 가수는 숨겨진 1비트와 52비트 가수를 합쳐서 1.M 꼴로 소수점 이하 값을 이진법으로 표현한다.
  • 가수 비트는 음의 지수 이진법(1/2, 1/4, 1/8, ...)으로 계산한다.
  • 이 덕분에 double은 2532^{53}까지는 정수를 정확하게 표현할 수 있다.
  • 그 이후부터는 가수 비트 부족으로 정확도가 떨어진다.

이렇게 부동소수점 구조와 가수 개념을 이해하면, 왜 컴퓨터가 부동소수점을 쓰는지, 그리고 부동소수점에서 생기는 오차가 왜 발생하는지 쉽게 이해할 수 있다.