목차
Floating Point Number
참고: https://codetorial.net/articles/floating_point.html
숫자를 부동소수점 방식으로 표현하기 - Codetorial
부호, 지수, 가수 IEEE 754 부동소수점 표현에서 숫자는 아래와 같이 부호부, 지수부, 가수부의 세 부분으로 구성됩니다. 각 부분의 역할과 사용하는 비트 수는 아래와 같습니다. 부호부 (Sign) : 1비
codetorial.net
부동소숫점이란 소숫점이 움직인다는 뜻이다. 부동소수점에서 부동은 움직이지 않는다는 뜻의 不動이 아니라, 오히려 그 반대의 의미로 소수점이 떠다니며 움직인다는 의미의 부동 (浮動)이다.
대부분의 프로그래밍 언어가 그렇듯, 부동소수점 표현법은 IEEE 754 표준을 따른다.
Sign( 부호부), Exponent( 지수부) , Mantissa( 가수부 )의 세 부분으로 구성된다.
- Sign: 1비트. 숫자의 부호를 나타내며, 양수일 때 0, 음수일 때 1. Most Significant Digit
- Exponent :8비트(float 경우)
- Mantissa : 23비트(float 경우). 유효숫자를 나타냄. 맨 우측칸은 Least Significant Digit
C++에서 소수는 크게 float / double/ long double로 나눌 수 있다. (물론 각기 안에서도 signed / unsigned float 등등 나뉜다)
type specifier | width | mantisa | exponent | literal |
float | usually 32 | 23 | 8 | 1.0f |
double | usually 64 | 52 | 11 | 1 |
long double | 64-128 | 1.0L |
정확도에 대하여 주의하자. 0.1f는 사람 눈으로 봤을 땐 0.1이지만 실제로는 0.1보다 아주 약간 큰수다.
0.02*5.0f 역시 사람 눈으로 봤을 땐 0.1이지만 실제로는 0.1보다 아주 약간 작은수다.
그래서 == 비교 연산은 실수에 사용하기 위험하다.
실수 비교를 굳이 해야한다면 include <cfloat> 한 후에 if(fabsf(a - b) <= FLT_EPSILON) 해보기.
물론 위 경우도 오차율이 누적되어서 FLT_EPSILON보다 벗어나면 먹히지 않는다.