실수 형식 표현 범위, FLT_MIN, FLT_MAX, FLT_TRUE_MIN [언제나 C언어]

안녕하세요. 언제나 휴일에 언휴예요.

이번 글은 강의는 아닙니다.

이 내용을 모르더라도 C언어를 익히는 데 영향이 없습니다.

실수 형식의 메모리 구조

C언어에서 실수는 메모리에 2진 체계에 의해 부호부, 지수부, 가수부로 표현합니다.

[그림] double 형식 메모리
[그림] float 형식 메모리

double 형식은 부호부(1), 지수부(11), 가수부(52)로 구성합니다.

float 형식은 부호부(1), 지수부(8), 가수부(23)로 구성합니다.

실수를 메모리에 표현하는 방법은 별도의 게시글로 제공하고 있으니 참고하세요.

실수를 메모리에 표현하는 방법 알아보기

FLT_MIN, FLT_MAX

실수 형식의 양수는 FLT_MIN~FLT_MAX까지 표현 가능한 것으로 알고 있습니다.

float.h에 이 값을 약속하고 있죠.

그런데 이러한 값이 메모리에 어떻게 표현하는지 아시나요?

FLT_MIN은 지수부가 1, 가수부가 1입니다. 부호는 양수이므로 0이죠.

FLT_MAX는 지수부가 0xFE, 가수부가 0x7FFFFF입니다.

그렇다면 지수부가 0인 값들과 0xFF인 값들은 무엇일까요?

지수부가 0xFF이고 가수부가 0인 값을 무한대로 정의하고 있습니다.

그리고 지수부가 0xFF이고 가수부가 0이 아닌 모든 값은 수가 아닌 값으로 nan으로 정의하고 있어요.

이에 유효한 지수부를 0x01~0xFE라고 약속한 것이죠.

하지만 지금은 지수부가 0이고 가수부가 1인 값을 FLT_TRUE_MIN으로 약속하고 있으며 실제 표현이 가능한 수입니다.

이 값들이 얼마인지는 다음 코드를 실행하면 당연히 알 수 있겠죠.

이를 확인하는 소스 코드를 같이 올립니다.

다시 한 번 얘기하지만 이 부분은 C언어 강의가 아닙니다.

/* https://ehpub.co.kr  언제나 C언어  실수 형식 표현 범위 */
#include  //표준 입출력 헤더
#include 
typedef union {
    float value;
    struct {
        unsigned mantissa : 23;
        unsigned exponent : 8;
        unsigned sign : 1;
    }sv;
}Test;
int main(void)
{   
    Test test = { 0 };
    test.sv.exponent = 1;
    test.sv.mantissa = 1;
    printf("%.50f\n", test.value);
    printf("%.50f\n", FLT_MIN);
    test.sv.exponent = 0;
    printf("%.50f\n", test.value);
    printf("%.50f\n", FLT_TRUE_MIN);
    test.sv.exponent = 0xFE;
    test.sv.mantissa = 0x7FFFFF;
    printf("%.50f\n", test.value);
    printf("%.50f\n", FLT_MAX);
    test.sv.exponent = 0xFF;
    test.sv.mantissa = 0;
    printf("%.50f\n", test.value);
    test.sv.mantissa = 3;
    printf("%.50f\n", test.value);
    return 0;
}

실행 결과입니다.

0.00000000000000000000000000000000000001175494490952
0.00000000000000000000000000000000000001175494350822
0.00000000000000000000000000000000000000000000140130
0.00000000000000000000000000000000000000000000140130
340282346638528859811704183484516925440.00000000000000000000000000000000000000000000000000
340282346638528859811704183484516925440.00000000000000000000000000000000000000000000000000
inf
nan