While reading a tutorial I came across how to represent Float number in memory. The tutorial had an example with a floating point number.
float a=5.2 with below Diagram
Can anyone please tell how this 5.2 is converted in to binary and how it is represented in memory in above the above diagram?
In memory, a floating point number is represented similarly: One bit has the sign, some bits form the factor as a fixed-precision number (“mantissa”), the remaining bits form the exponent. Significant differences to base-10 engineering notation is that of course now the exponent has base 2.
A "floating-point constant" is a decimal number that represents a signed real number. The representation of a signed real number includes an integer portion, a fractional portion, and an exponent. Use floating-point constants to represent floating-point values that can't be changed.
Eight digits are used to represent a floating point number : two for the exponent and six for the mantissa. The sign of the mantissa will be represented as + or -, but in the computer it is represented by a bit: 1 means negative, 0 means positive. This representation makes it easy to compare numbers.
The exponent is stored as an unsigned integer, for 32-bits floating-point values, this field is 8 bits. 1 represents the smallest exponent and "all ones - 1" the largest. (0 and "all ones" are used to encode special values, see below.)
As was said, 5.2 is represented as a sign bit, an exponent and a mantissa. How do you encode 5.2?
5 is easy:
101.
The rest, 0.2 is 1/5, so divide 1.00000...
(hex) by 5 and you get 0.3333333...
(hex).
(This can be followed more easily if you consider one bit less: 0.FFFF...
→ F / 5 = 3
, so it is easy to see that 0.FFFF... / 5 = 0.33333...
. That one missing bit doesn't matter when dividing by 5, so 1.0000... / 5 = 0.3333...
too).
That should give you
0.0011001100110011001100110011...
Add 5, and you get
101.00110011001100110011... exp 0 (== 5.2 * 2^0)
Now shift it right (normalize it, i.e. make sure the top bit is just before the decimal point) and adjust the exponent accordingly:
1.010011001100110011001100110011... exp +2 (== 1.3 * 2^2 == 5.2)
Now you only have to add the bias of 127 (i.e. 129 = 0b10000001
) to the exponent and store it:
0 10000001 1010 0110 0110 0110 0110 0110
Forget the top 1 of the mantissa (which is always supposed to be 1, except for some special values, so it is not stored), and you get:
01000000 10100110 01100110 01100110
Now you only have to decide little or big endian.
This is not exactly how it works, but that is more or less what happens when a number like 5.2 is converted to binary.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With