부동소수점 숫자

2025. 4. 29. 20:34C++

정확도 대  정밀도

"정확도"는 측정값이 실제 값에 얼마나 가까운지를 나타내는 반면,

"정밀도"는 어떤 양에 대해 얼마나 많은 정보를 가지고 있는지, 그리고 얼마나 고유하게 고정되어 있는지와 관련이 있습니다.

 

정수는 정확성이라는 특성을 지님. 그러나 정밀도는 낮음.

ex) 4/2 = 2, 5/2 = 2

 

부동소수점 숫자는 정확도와 정밀도 측면에서 정수와 정반대이다.

숫자를 나타내는 정보를 의도적으로 버리지 않으므로 정밀도가 좋다. 비트가 충분하다면 모든 FP 계산을 역순으로 처리하여 원래 숫자를 얻을 수 있다.

하지만 부동소수점 숫자는 정확도가 낮다. 많은 비트를 써서 최대한 근사하지만, 그 값이 진짜 원래 값은 아니다.

ex) 1/3 = 0.33333333333, 0.1 + 0.2 == 0.3 False

 

표현

IEEE-754 부동소수점(4바이트) 또는 배정도(8바이트)는 세 가지 구성요소로 이루어짐.

부호비트 1비트     sign bit (양수 또는 음수)

지수        8비트     exponent(실제 지수 + 바이어스(127))

가수        23비트   mantissa(실수 부분의 이진 표현 정규화 시 맨 앞의 1은 생략)

실제 값 = (-1)^s x (1.m) x 2^(e - 127)

 

1. 지수 바이어스(bias - 127)

지수 비트는 실제 지수를 저장하지 않고, 127을 더한 값을 저장

ex) 지수 비트 = 10000000 (128)이면 실제 지수는 128 - 127 = 1이다. 이렇게 음수도 표현 가능

2. 정규화된 수(Normalized numbers)

IEEE - 754에서 정규화된 수는 항상 1.m 형태를 따릅니다.

ex) 1.0110... 와 같이 맨 앞 비트가 항상 1이므로 저장하지 않음 -> 암묵적 1

       저장되는 것은 소수점 이하만: 0.0110...

최상위 1비트를 저장하지 않음으로써 정밀도를 높이는 비트 절약효과

3. 예외적인 경우들

1. 0

지수 비트 = 00000000, 가수 비트 = 000...000

부호 비트가 0이면 +0, 1이면 -0

2. 무한대(Infinity)

지수 비트 = 11111111, 가수 비트 = 000...000

부호 비트만 다르다면 +∞, -∞

3 NaN(Not a Number)

지수 비트 = 11111111, 가수 비트 = 0이 아님

ex) 0/0, ∞ - ∞, ∞ x 0 등

4. 서브노멀 수(Subnormal / Denormal numbers)

지수 비트 = 00000000, 가수 비트 = 0이 아닌 경우

암묵적 1이 붙지 않음(즉, 0.m 형태로 해석)

표현 가능한 가장 작은 양의 실수

ex) 가장 작은 양의 서브노멀 수 = 2^(-126 - 23) ≈ 1.4e-45

서브노멀 수는 아주 작은 값도 표현할 수 있지만, 정밀도가 낮음.(맨 왼쪽 비트들이 전부 0으로 채워지므로)

5. 기계 엡실론(Epsilon, ε)

1 + ε > 1 이 되는 가장 작은 부동 소수점 값

단정도에서는 약 1.1920929e - 7

이 값은 부동소수점 비교의 오차 범위 계산 등에 매우 중요

숫자IEEE-754 32비트 HEX 표현설명

0 0x00000000 +0
1.0 0x3f800000 지수: 127 (0), 가수: 0
0.5 0x3f000000 지수: 126 (-1), 가수: 0
3.0 0x40400000 지수: 128 (+1), 가수: 1.5
+∞ 0x7f800000 지수: 255, 가수: 0
-∞ 0xff800000 부호 1, 지수 255
NaN 0x7fc00000 지수 255, 가수 ≠ 0

'C++' 카테고리의 다른 글

부동소수점 정수 변환  (0) 2025.04.30
round  (0) 2025.04.30
Orthodox Canonical Form  (0) 2025.04.29
fstream  (0) 2025.03.31
참조자(Reference)  (0) 2025.03.27