[Computer Science] IEEE 754 부동 소수점

양영준·2026년 2월 3일

Computer Science

목록 보기
7/12
post-thumbnail

📌 부동 소수점

부동 소수점에서 부동(浮動)떠다니며 정해진 위치가 없음을 뜻하는 단어이다.
따라서 부동 소수점은 소수점의 위치가 고정되어 있지 않고 데이터의 크기나 정밀도에 따라 자유롭게 이동 가능한 소수점을 뜻한다.
이러한 특성 덕분에 컴퓨터는 다양한 범위의 실수를 효율적으로 표현할 수 있다.

💡 고정 소수점과의 차이

고정 소수점 방식은 한 번 정해진 표현 범위 밖의 수를 표현할 수 없다.
위 그림은 숫자를 4byte(32bit) 시스템에서 표현한다고 했을 때, 임의로 정수 부분과 소수 부분을 나누어 놓은 그림이다.
해당 그림대로 나누었을 때, -65536 초과 65536 미만의 수 밖에 표현할 수 없다. 이를 넘어서는 숫자를 표현하려고 하면 정수 부분이 17bit가 필요하여 제대로 표현할 수가 없게 된다.

반면 부동 소수점 방식으로 표현할 경우, 표현하고자 하는 숫자를 정규화를 통해 표현하고 정규화된 값을 지수 부분과 가수 부분으로 나누어 저장하여동일한 공간을 사용하더라도 더 넓은 범위의 숫자를 표현할 수 있다.

💡 비트 구성

1. 부호 비트

가장 왼쪽 하나의 비트를 뜻하며, 표현하는 숫자가 양수인지 음수인지 판단한다.
양수인 경우 0, 음수인 경우 1이 저장된다.

2. 지수부

표현할 숫자를 정규화했을 때, 지수에 해당하는 값을 저장하는 부분이다.
지수부는 지수 값이 그대로 저장되는 것이 아니라 편향 지수 (Biased Exponent) 표현 방식을 사용하여 Bias가 더해진 값을 저장한다.

32bit 단정밀도64bit 배정밀도
할당 비트 수8 bits11 bits
Bias 값127 (2^7 - 1)1023 (2^10 - 1)

3. 가수부

표현할 숫자를 정규화했을 때, 가수에 해당하는 값을 저장하는 부분이다.
가수를 저장할 때 소숫점 아래의 부분만을 저장한다.

32bit 단정밀도64bit 배정밀도
할당 비트 수23 bits52 bits

소수점 아래 부분만 저장하는 이유?

정규화 자체가 정수 부분이 1이 될 때까지 밑을 곱하거나 나누는 과정을 뜻한다.
그렇기 때문에 정규화가 완료되었다면 항상 가수의 정수 부분은 1이 된다.
가수를 저장하는 bit 자체가 제한되어 있기 때문에 무조건 1이 나오는 정수부를 제외하고 저장하여 좀 더 넓은 범위의 값을 저장할 수 있게 된다.

💡 편향 지수 (Biased Exponent)

편향 지수는 부동 소수점 표현에서 사용되는 지수 부분 표현 방식 중 하나로, 컴퓨터가 부동 소수점 숫자를 효율적으로 표현하고 비교할 수 있도록 해주는 방법 중 하나이다.

왜 사용하는가?

부호가 존재하는 ( signed ) 2의 보수법은 값의 비교하는데 어려움이 존재한다.
이러한 어려움을 해결하기 위해 부호를 통일한 unsigned 값으로 변경하여 값의 비교를 쉽게 하기 위해 사용된다.

8 bit 메모리 환경에서 몇 개의 수를 2의 보수법으로 표현했을 때

  • 11111111 = -1
  • 00000001 = +1
  • 10000000 = -128
  • 01111111 = +127

이며, 이를 십진수와 함께 표로 정리하면

2의 보수법10진수
01111111+127+127
00000001+1+1
11111111-1+255
10000000-128+128

위와 같이 표현 가능하다.
표에서 보다시피 2의 보수법 상으로는 내림차순으로 깔끔하게 정렬되어 있지만, 10진수를 기준으로는 제대로 정렬되어 있지 않음을 알 수 있다.
이는 컴퓨터 내부 처리 장치에서 값을 비교하는데 어려움을 발생시키므로 이를 해결하기 위해 데이터 크기에 맞는 Bias 상수를 통해 unsigned 한 값으로 변경시킨다.

💡 특수 케이스

1. 모든 지수부 비트가 0인 경우 (subnorrmal number)

부동 소수점의 경우, 정규화된 값을 저장하는 것이기 때문에 보통의 경우 0을 표현할 수 없다.
이를 해결하기 위해 subnormal number 라는 이름의 예외를 두기로 하였다.

  1. 지수부 모든 비트가 0인 경우, 소수점 앞 정수 (정수부) 값을 1이 아닌 0으로 사용한다.
  2. 지수는 -127이 아닌 -126을 사용한다.

해당 예외를 통해 모든 비트가 0일 경우, 0을 표현할 수 있게 되었다.
또한 0과 2^-126 사이의 더 작은 수도 표현할 수 있게 되었다.
지수부 모든 비트가 0이고, 가수부 비트 중 가장 오른쪽의 비트가 1인 경우 2^-126 * 2^-23 = 2^-149 까지 표현할 수 있게 표현의 범위가 넓어진다.

2. 모든 지수부 비트가 1인 경우

모든 지수부 비트가 1인 경우는 두가지 경우로 다시 나뉘어지게 된다.

  1. 가수부 또한 모두 0인 경우 : 무한 (Infinity)를 표현
  2. 가수부 비트 중 어느 하나라도 1인 경우 : NaN (Not a Number)로 사용

💡 한계

가수를 저장할 수 있는 비트 수가 제한되어 있기 때문에 아무리 표현 범위가 넓다지만 주어진 비트가 표현할 수 없는 값을 저장하려고 하게 되면 주어진 비트 이후의 값은 버려지게 되어 근사값이 저장되게 된다.

이러한 한계 때문에 연산에 오차가 발생할 수 있다.

#include <iostream>

using namespace std;

int main()
{
	float f = 0.0f;
	for (int i = 0;i < 10;i++)
	{
		f += 0.1f;
	}
	
	if (f == 1.0f)
		cout << "true" << endl;
	else
		cout << "false" << endl;
}

코드 실행 결과

대표적인 예시로 0.1 * 10 != 1 의 경우를 들 수 있다.
0.1을 2진법으로 표현하면 0.0001100110011... 으로 무한 소수의 형태를 띈다.
이를 32bit 부동 소수점을 사용하는 float에 저장하게 되면 무한한 비트들 중 23비트만을 절삭하여 저장하기 때문에 온전한 0.1이 아닌 근사치 값이 저장되게 된다.
따라서 이에 따른 오차가 발생하게 되고, 0.1을 10번 더한다고 1.0이 되지 않는 것이다.


Reference

부동 소수점 - 위키백과
지수 편향 - 위키백과
부동 소수점의 이해 (1부)
부동 소수점의 이해 (2부)
고정소수점과 부동소수점 - 컴퓨터가 숫자를 이해하는 방법
부동소수점 편향된 지수 Biased Exponent
floating point는 왜 Bias(이하 Bias 표현법)를 사용할까? (목적, Bias 연산 등 예시)

profile
학습 내용 정리 순차적 갱신 / 정리 중

0개의 댓글