How can I convert from Q3.5 format to decimal using an 8-bit microcontroller?

  • Thread starter Thread starter PhantomPower
  • Start date Start date
  • Tags Tags
    Fixed point Point
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
2 replies · 2K views
PhantomPower
Messages
14
Reaction score
0
Hello,

I am currently trying to figure out if its possible to go from a number in (unsigned) Q3.5 format -> 8 bits given.

And print it on a display in decimal.

I only have a 8 bit microcontroller to work with.

For example 011.11010 should have 3.8125

Getting to 3 is easy but I can't see how I could get 8125 - I know I need to divide the 26 by 2^5 but this would give me 0 as an inside an 8 bit microcontroller.

Any tips - Or some C source code would be lovely.
Thanks in advance.
 
on Phys.org
PhantomPower said:
Hello,

I am currently trying to figure out if its possible to go from a number in (unsigned) Q3.5 format -> 8 bits given.

And print it on a display in decimal.

I only have a 8 bit microcontroller to work with.

For example 011.11010 should have 3.8125

Getting to 3 is easy but I can't see how I could get 8125 - I know I need to divide the 26 by 2^5 but this would give me 0 as an inside an 8 bit microcontroller.
The part of your number to the right of the 'binary' point is a binary fraction.

.11010 means 1 * 2-1 + 1 * 22 + 0 * 2-3 + 1 * 2-4 + 0 * 2-5
= 1/2 + 1/4 + 0/8 + 1/16 + 0/32
= 13/16
= .8125

Please excuse me if you already know this. At first I thought you didn't, because of what you said about 26. I then realized that you were adding the bits, and didn't realize that you were representing the fraction as 26/32, which is the same as 13/16.

Binary fractions work exactly like decimal fractions except that instead of having decreasing negative powers of 10, you have decreasing negative powers of 2.
PhantomPower said:
Any tips - Or some C source code would be lovely.
Thanks in advance.

I recommend using a lookup table. The table (an array) should have 32 elements, one for each possible value of a 5 bit number. Each element in the table is a string of decimal digits.

Index the table by the sum of the 5 bits.
 
Hey, thanks for the reply.

Yeah I figure out how to get the conversions - Sorry about my ambigous language.

Figured out if I store it in a int (4 bytes) then I can bit mask to get the 5 bits representing the fractional - then multiply by 100000 and divide by 2^5 giving me the fractional bits without the point.

Thanks