Well this really depends on the question being asked and the expectation of the lecturer.
One approach would be to have a 32-bit number storing a 16.16 fixed point representation. ie the upper 16-bits are the integer portion, the lower 16-bits fractional.
For example
5.3232
Read this in as a whole, taking note of the decimal place 53232 = 0x0000CFF0
There are 4 decimal places, so the number must ultimately be divided by 10000 (0x2710), but
First you shift the number 16-bits left, or *65536 0x0000CFF0 * 65536 = 0xCFF00000
Now we divide that by 10000 0xCFF00000 / 10000 = 0x000552BD
Note the high-order sixteen bits are 0x0005 (5), the integer portion.
To decode the fractional portion, remove the high-order word, and multiply by 10 0x000052BD * 10 = 0x00033B62, so 3 Repeating 0x00003B62 * 10 = 0x000251D4, so 2 0x000051D4 * 10 = 0x00033248, so 3 0x00003248 * 10 = 0x0001F6D0, so 1 0x0000F6D0 * 10 = 0x0009A420, so 9
Making the decimal portion .32319, the imprecision due to the limited 16-bits available, and the limit of binary fractions to represent certain values. ie Like base 10 representing 1/3
You could address this by only printing 4 digits and rounding, but this might be beyond the scope of the exercise.
The precision could be improved by using a 4.28 fixed point representation (4-bit integer, 28-bit fractional) for example, or 8.24, depending on how large you expect your integer portion to be, or if you need to handle signing.
|