공통

부동소수점

iseohyun 2022. 1. 6.

목차

    아래 방법은 float (32bit)부동소수점을 저장하는 방식을 설명합니다. 외울 필요는 없고, 이런 방식으로 저장이 된다라는 것만 이해하면 됩니다.

    • -118.625 = -1110110.101(2)
    • -1110110.101 = -1.110110101×2 (정수 1은 탈락시킨다. 왜냐하면, 언제나 1이므로)
    • 부호 : 1 / 가수부 : 11011010100000000000000 / 지수부 : 6+127 = 133 =10000101(2)

    코드상으로 저장된 것을 확인해 보자면,

    int main()
    {
    	int p = 0b11000010111011010100000000000000;	// C2 ED 40 00
    	float q = -118.625;
    
    	printf("2진수 : %X\n", p);
    	printf("소수 였던 것 : %X\n", *((int*) &q));
    	printf("2진수 였던 것 : %f\n", *((float*) & p));
    }
    2진수 : C2ED4000
    소수 였던 것 : C2ED4000
    2진수 였던 것 : -118.625000

    ※ 출처 : 위키피디아, https://ko.wikipedia.org/wiki/%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90


     

    ※ 주의 할 점

    int main()
    {
    	double p = 0.1;
    	printf("내가 원하는 결과 : %f\n", p * 1000);
    	for (int i = 0; i < 1000; i++) {
    		p += 0.1;
    	}
    	printf("실제 연산 결과 : %f\n", p);
    }
    내가 원하는 결과 : 100.000000
    실제 연산 결과 : 100.100000

     2진법 -> 10진법으로 표현할 때, 또는 반대로 10진법 -> 2진법으로 표현할 때, 정보가 사라질 가능성이 있습니다. float형 대신 double형을 사용한다고 하면, 정밀도가 높아지기는 하나, 이러한 정보의 누락현상은 반드시 생길 수 밖에 없습니다. 

    '공통' 카테고리의 다른 글

    강사자료  (0) 2022.01.10
    한글  (135) 2022.01.06
    printf  (0) 2022.01.06
    컴퓨터 구조  (0) 2022.01.04
    변수 선언하기  (0) 2022.01.03

    댓글