Post

Floating Point

부동소수점(浮動小數點, floating point)

부동소수점(浮動小數點, floating point)은 컴퓨터에서 실수를 표현하는 방식 중 하나이다. 정수만으로는 표현할 수 없는 소수점이 있는 숫자 (e.g. 3.14, -0.0001, 2.71828… 등)를 저장하고 계산할 수 있도록 만든 방식이다. 여기서 “부동(floating)”이라는 말은 소수점의 위치가 고정되어 있지않고 자유롭게 이동할 수 있다는 의미이다.

여기서의 부동(浮動)은 떠다니며 움직인다는 뜻으로 움직이지 않는다는 의미의 부동(不動)과 헷갈리지 않도록 주의하자. 실제로 고정소수점(固定小數點, Fixed-point arithmetic)이라는 개념이 존재한다.

Fixed point 구조

fixed point

위 이미지는 Fixed-Point (고정 소수점)의 8비트 표현 구조를 보여준다.

구간비트 수설명
정수부4비트소수점 왼쪽, 정수 부분을 표현
소수부4비트소수점 오른쪽, 소수 부분을 표현

예를 들어, 이진수가 01101000이라면

  • 0110 → 정수부 = 6
  • 1000 → 소수부 = 0.5 (이진수 1×2⁻¹)

전체 숫자는 6.5가 된다.

Floating point 구조

대부분의 시스템은 IEEE 754 표준을 사용하며, float(32비트) 또는 double(64비트) 형식으로 표현한다. IEEE 754의 최신 버전은 IEEE 754-2019이다. 공식문서는 학회 소속이나 관련 연구기관 소속이라는 인증을 해야 받아볼 수 있는듯하다.

floating point

32비트 float의 구조는 위와 같다.

  • 1비트: 부호 비트 (sign bit) – 양수/음수 구분
  • 8비트: 지수부 (exponent) – 소수점의 위치를 나타냄
  • 23비트: 가수부 (mantissa or significand) – 실제 숫자 정보

즉, 다음과 같이 표현된다:

1
(-1)^sign × 1.mantissa × 2^(exponent - bias)

부동소수점 표현식 해석

1. sign(부호 비트)

숫자가 양수인지 음수인지를 나타내는 비트이다.

  • sign = 0 → 양수
  • sign = 1 → 음수

따라서 식에서 (-1)^sign부호를 결정하는 부분이다.

  • (-1)^0 = +1 → 양수
  • (-1)^1 = -1 → 음수

2. mantissa(가수부 또는 유효숫자부)

실제 숫자의 주요한 값(유효 숫자)을 담고 있는 부분이다.

이진수로 표현될 때는 항상 1.XXXX 형태로 표현되므로, 앞의 1은 생략하고 소수 부분만 저장한다.

  • 예를 들어, 1.10101 → mantissa에는 10101... 만 저장된다.
  • 실제 계산 시에는 1.을 붙여서 1.mantissa 형태로 쓴다.

※ 이 부분이 수의 정밀도를 좌우하므로 이 범위를 최대한으로 확보하는 것이 중요하다.

3. exponent(지수부)

이 숫자가 얼마나 크거나 작은지를 결정하는 지수이다. 2진수의 지수니까 2의 몇 제곱인지에 대한 자릿수를 나타낸다.

하지만 지수에는 음수도 나와야 하므로, 실제 저장할 땐 bias를 더한 값을 저장한다. 예를 들어, 실제 지수 -2 → 저장 값은 bias + (-2)

4. bias(편향값)

음수 지수를 표현하기 위해 지수에 더해지는 고정된 값이다.

  • 32비트 float에서는 bias = 127
  • 64비트 double에서는 bias = 1023

예를 들어,

  • 저장된 exponent = 130이라면 실제 지수는 130 - 127 = 3
  • 저장된 exponent = 124라면 실제 지수는 124 - 127 = -3

32비트 float에서

  • sign = 0 → 양수
  • exponent = 130 → 실제 지수는 130 - 127 = 3
  • mantissa = 01000000000000000000000 (실제로는 소수 부분만 저장됨)

예를 들어, 실수 3.14를 컴퓨터는 다음과 같이 저장한다.

1
2
3
sign = 0 (양수)
exponent = 128 (지수 1)
mantissa = 1.570796...

실제 계산과정

실수값 10.0IEEE 754 32비트 float 메모리 구조에서 아래의 바이너리 값으로 저장한다.

1
[0][10000010][01000000000000000000000]
구간비트 값설명
Sign0양수
Exponent10000010 (10진수: 130)실제 지수 = 130 - 127 = 3
Mantissa01000000000000000000000실제 값: 1.010 (2진수) = 1.25

이때 계산식은 다음과 같다.

1
(-1)^0  × 1.25  ×  2^3 = 1.25  ×  8 = 10.0

실제로 컴퓨터는 실수 10.0을 32비트 메모리로 분해해서 저장하고, 계산 시 위 수식을 사용한다.

이 과정을 이해하기 쉽게 시뮬레이션 해볼 수 있는 사이트도 있다. 10진수로 10을 입력하면 10.0의 실제 저장되는 값이 표현된다.

floating point converter


정리

부동소수점 방식의 장점은 다음과 같다.

  • 아주 큰 수 또는 아주 작은 수를 저장할 수 있음
  • 실수 계산에 유리함

하지만 이 방식의 한계점도 존재하므로 주의해야한다.

  • 정확하지 않은 근사값을 저장 (ex. 0.1은 정확히 표현 불가)
  • 오차 누적 가능성 존재 → 금융, 과학 계산에서 주의 필요

참고자료

This post is licensed under CC BY 4.0 by the author.