[Source Code]
#include <iostream>
#include <string>
typedef unsigned int uint32;
std::string tobin(int significand)
{
std::string res = (significand == 0) ? "1" : "1.";
int mask = 0x00400000;
while (significand != 0)
{
if (significand & mask)
res += "1";
else
res += "0";
significand &= ~mask;
mask >>= 1;
}
return res;
}
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
std::cout << f << " = " <<( (sign == 0) ? " " : "-" ) << "2^" << exponent << " * " << tobin(significand) << "(b)" << std::endl;
}
int main()
{
float f;
while (true)
{
std::cin >> f;
writeFloat(f);
if (f == 0) break;
}
return 0;
}
[Result]
1 = 2^0 * 1(b)
2 = 2^1 * 1(b)
3 = 2^1 * 1.1(b)
4 = 2^2 * 1(b)
5 = 2^2 * 1.01(b)
6 = 2^2 * 1.1(b)
7 = 2^2 * 1.11(b)
8 = 2^3 * 1(b)
9 = 2^3 * 1.001(b)
10 = 2^3 * 1.01(b)
-1 = -2^0 * 1(b)
-2 = -2^1 * 1(b)
-3 = -2^1 * 1.1(b)
-4 = -2^2 * 1(b)
-5 = -2^2 * 1.01(b)
-6 = -2^2 * 1.1(b)
-7 = -2^2 * 1.11(b)
-8 = -2^3 * 1(b)
-9 = -2^3 * 1.001(b)
-10 = -2^3 * 1.01(b)
1 = 2^0 * 1(b)
2 = 2^1 * 1(b)
4 = 2^2 * 1(b)
8 = 2^3 * 1(b)
16 = 2^4 * 1(b)
32 = 2^5 * 1(b)
64 = 2^6 * 1(b)
128 = 2^7 * 1(b)
256 = 2^8 * 1(b)
0.5 = 2^-1 * 1(b)
0.25 = 2^-2 * 1(b)
0.125 = 2^-3 * 1(b)
0.0625 = 2^-4 * 1(b)
0.03125 = 2^-5 * 1(b)
0.015625 = 2^-6 * 1(b)
0.0078125 = 2^-7 * 1(b)
0.00390625 = 2^-8 * 1(b)
0.1 = 2^-4 * 1.10011001100110011001101(b)
0.2 = 2^-3 * 1.10011001100110011001101(b)
0.3 = 2^-2 * 1.0011001100110011001101(b)
0.4 = 2^-2 * 1.10011001100110011001101(b)
0.5 = 2^-1 * 1(b)
0.6 = 2^-1 * 1.0011001100110011001101(b)
0.7 = 2^-1 * 1.01100110011001100110011(b)
0.8 = 2^-1 * 1.10011001100110011001101(b)
0.9 = 2^-1 * 1.1100110011001100110011(b)
69.8 = 2^6 * 1.0001011100110011001101(b)
0 = 2^-127 * 1(b)
[Download]
As seen above, so many simple decimal numbers(e.g. 69.8) can not be transformed exactly into floating point numbers.
For more information, http://en.wikipedia.org/wiki/Single_precision_floating-point_format