여러가지 방법이 있지만 요즘에는 실수를 2진수로 처리를 합니다.
floating point를 사용하는 방법은 여기를 참고하시기 바랍니다.
http://en.wikipedia.org/wiki/Single_precision_floating-point_format
아래는 소스및 실행 결과입니다. sign, exponent, significand가 어떻게 구성되어 있는지를 알 수 있습니다.
void writeFloat(float f)
{
uint32 u;
int sign;
int exponent;
int significand;
//
// Extract bits
//
u = *(uint32*)&f;
//
// Extract sign
//
sign = (u & 0x80000000) >> 31; // 1 bit
//
// Extract exponent
//
exponent = (u & 0x7F800000) >> 23; // 8 bit
exponent -= 127; // exponent bias
//
// Extract significand
//
significand = (u & 0x007FFFFF); // 23 bit
significand |= 0x00800000; // implicit leading bit with value 1
printf("%10f %x %d %d 0x%x\n", f, u, sign, exponent, significand, significand);
}
int main()
{
writeFloat(0.125);
writeFloat(0.25);
writeFloat(0.5);
writeFloat(1);
writeFloat(2);
writeFloat(3);
writeFloat(4);
writeFloat(8);
writeFloat(16);
}
[실행결과]
0.125000 3e000000 0 -3 0x800000
0.250000 3e800000 0 -2 0x800000
0.500000 3f000000 0 -1 0x800000
1.000000 3f800000 0 0 0x800000
2.000000 40000000 0 1 0x800000
3.000000 40400000 0 1 0xc00000
4.000000 40800000 0 2 0x800000
8.000000 41000000 0 3 0x800000
16.000000 41800000 0 4 0x800000 |