부동 소수점 표현

Posted by push0ebp
2014. 6. 14. 21:39 카테고리 없음

10진수 : 1234.5678 2진수 : 0001 0010 0011 0100 . 10010

1)     부호부 (1bit)

사인비트는 +일때 0 –일때 1이므로

S

지수부

소수부 (가수부)

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2)     지수부 (8bit)

             

정규화 : 1.001101001010010 * 2^10

Bias 127 이므로

127+10 = 137 à 지수부 137 = 1000 1001

S

지수부

소수부 (가수부)

0

1

0

0

0

1

0

0

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3)     소수부 (23bit)

S

지수부

소수부 (가수부)

0

1

0

0

0

1

0

0

1

0

0

1

1

0

1

0

0

1

0

1

0

0

1

0

0

0

0

0

0

0

0

0

-> 나머지 비트 0 확장

결과 0  10001001   001 1010 0101 0010 0000 0000 16진수로 나타내면

0x449A5200이 됨

float f = 1234.5678;

printf("%f %X\n", f,*(DWORD*)&f ); 

출력 : 1234.567749 449A522B

0x449A5200 0x449A522B    0x2B 는 오차

10진수 : -0.01171875 2진수 : -0 . 0000001100

1)     부호부 (1bit)

사인비트는 +일때 0 , –일때 1이므로

S

지수부

소수부 (가수부)

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2)     지수부 (8bit)

정규화 1.100 * 2^-7

Bias 127 이므로

127+(-7) = 120 à 지수부 120 = 0111 1000

S

지수부

소수부 (가수부)

1

0

1

1

1

1

0

0

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3)     소수부 (23bit)

S

지수부

소수부 (가수부)

0

0

1

1

1

1

0

0

0

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

-> 나머지 비트 0 확장

결과 1 0111 1000 100 0000 0000 0000 0000 0000 16진수로 나타내면

BC400000이 됨

float f = -0.01171875;

printf("%f %X", f, *(DWORD*)&f);

출력 : -0.011719 BC400000

0xBC400000  =  0xBC400000

 

10진수 -> 2진수 소수점 표현

#include <stdio.h

 

void bin(double put);

 

void main()

{

        double put;

        int cho;

        while (1) {

               printf("전환원하는 십진수를 입력해주세요 : ");

               scanf("%lf", &put);

               printf("전환원하는 진수의 번호를 선택해주세요 1)2진수, 2)8진수, 3)16진수 :");

               scanf("%d", &cho);

 

               if (cho == 1){

                       bin(put);

               }

               else{

                       printf("잘못된 수를 입력하였습니다.");

               }

        }

}

 

void bin(double put)//2진수 계산

{

        double pri;

        int i, num[20], num2[5];

        pri = put - (int)put;//소수부분만 빼냄

        for (i = 0; i<20; i++){//정수부분 계산

               num[i] = (int)put % 2;

               put = (int)put / 2;

        }

        for (i = 0; i<5; i++){//소수부분 계산

               num2[i] = (int)(pri * 2);

               pri *= 2;

               if (pri >= 1){

                       pri -= 1;

               }

        }

        for (i = 19; i >= 0; i--){//정수부분 출력

               printf("%d", num[i]);

               if (i>1 && i % 4 == 0){

                       printf(" ");

               }

        }

        printf(".");

        for (i = 0; i<5; i++){//소수부분 출력

               printf("%d", num2[i]);

        }

        printf("\n");

        return;

부동소수점.pdf


소스 출처 : http://blog.naver.com/luckywjd7/140196723671