아래 방법은 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형을 사용한다고 하면, 정밀도가 높아지기는 하나, 이러한 정보의 누락현상은 반드시 생길 수 밖에 없습니다.
댓글