부동 소수점 표현
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;
소스 출처 : http://blog.naver.com/luckywjd7/140196723671