본문 바로가기

카테고리 없음

C언어_실수형 데이터 출력 테스트

int main(int argc, char **argv){
    float num_f = 123.456789123456789;
    double num_d = 123.456789123456789;
 
    fprintf(stdout, "num1 : %.20f\nnum2: %.20f\n", num_f, num_d);
}

[결과 분석]

 

IEEE 754 표준에 따르면

Float Type Data(32-bit single-precision)은

exponent 표현에 8bits / fraction 표현에 23bits를 이용하며

Float Type Data(32-bit single-precision)은

exponent 표현에 11bits / fraction 표현에 52bits를 이용한다.

 

123.456789123456789(10) 를 2진수로 표현하면 1111011.0111010011110000001000011100101 ... (2)

가 된다.

1111011.0111010011110000001000011100101를 정규화 시키면

1.11101 10111 01001 11100 00001 00001 11001 01 x 26 이고

num_f의 경우, fraction을 23bit 만 가질 수 있기 때문에

exponent part : 6 + 127 = 133(10) = 10000101(2)

fraction part : 11101101110100111100000 이 된다.

 

num_f 표현

01000010111101101110100111100000 로 표현이 된다.

(보기 쉽게 하면 [0] [10000101] [11101101110100111100000] )

 

(검증)

01000010111101101110100111100000에서

exponent part : 10000101 (=133)

fraction part : 11101101110100111100000

 

exponent part : 133 – 127 = 6

1.11101101110100111100000 x 26 = 1111011.01110100111100000(2) = 123.456787109

 

double type Data 역시 이와 같은 방법으로 Data가 표현이 된다.

(exponent 표현에 11bits fraction 표현에 52bits로 더 넓은 범위의 값을
표현할 수 있는 것이 차이)