본문 바로가기
각종 언어 기본 문법/C++

Cpp 기초 : 자료형 - 숫자형 (3) 실수

by 혀니쌤1 2023. 12. 25.

목차

    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보다 벗어나면 먹히지 않는다.