카테고리 없음

20250415 TIL 부동소수점 문제 1.1f -0.1f == 1.0f ?

note4973 2025. 4. 15. 21:14

10진수 체계를 컴퓨터에서 처리할때 2진수로 처리되는데

float은 부동소수점을 사용하여 실수를 저장한다

부동소수점은 다음과 같이 구성되는데

부호, 지수, 가수

부호 1비트 지수 7비트 가수 23비트로 처리된다.

 

10진수2진수 표현특징

0.5 0.1 정확하게 표현됨
0.25 0.01 정확하게 표현됨
0.1 0.0001100110011...(반복) 무한 반복됨
1.1 1.0001100110011...(반복) 무한 반복됨
실수 = ± 1.M × 2^(E - Bias)

 

  • M: 가수 (소수부를 2진수로 저장)
  • E: 지수
  • Bias: float일 경우 127

어렸을때 배운 무한순환소수와 같이 10진수에서 무한순환소수가 아니더라도 2진수에서는 무한순환 소수인 경우가 존재한다.

무한순환소수가 제대로 계산된다면 문제가 발생하지 않겠지만 가수는 23비트만 저장 가능하여 아주 작은 단위아래로는 오차가 발생한다. 그로인해

float a = 1.1f;
float b = 0.1f;
float c = 1.0f;

float result = a - b;

Debug.Log(result);         // 출력: 1.0000001 (예시)
Debug.Log(result == c);    // false

 

는 실질적으로

a = 1.10000002384185791015625
b = 0.1000000014901161193847656
a - b = 1.0000000223517417907714844

가 되어 1.1f - 0.1f  != 1.0f 가 된다.