#include <stdio.h>
typedef struct
{
signed short m;
unsigned char f;
} Q16_8;
Q16_8 toQ(double d)
{
Q16_8 q;
long x = d * 256;
q.m = x >> 8; // this assumes >> to be an arithmetic shift
q.f = x & 0xFF; // this assumes signed ints to be 2's complement
return q;
}
double toDouble(Q16_8 q)
{
long x = ((long)q.m << 8) + q.f;
return x / 256.0;
}
int main(void)
{
int i;
for (i = -2*4; i <= +2*4; i++)
{
double d = i / 4.0;
Q16_8 q = toQ(d);
double d2 = toDouble(q);
printf("toDouble(toQ(%f)) = %f\n", d
, d2
); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBzaWduZWQgc2hvcnQgbTsKICAgIHVuc2lnbmVkIGNoYXIgZjsKfSBRMTZfODsKClExNl84IHRvUShkb3VibGUgZCkKewogICAgUTE2XzggcTsKICAgIGxvbmcgeCA9IGQgKiAyNTY7CiAgICBxLm0gPSB4ID4+IDg7IC8vIHRoaXMgYXNzdW1lcyA+PiB0byBiZSBhbiBhcml0aG1ldGljIHNoaWZ0CiAgICBxLmYgPSB4ICYgMHhGRjsgLy8gdGhpcyBhc3N1bWVzIHNpZ25lZCBpbnRzIHRvIGJlIDIncyBjb21wbGVtZW50CiAgICByZXR1cm4gcTsKfQoKZG91YmxlIHRvRG91YmxlKFExNl84IHEpCnsKICAgIGxvbmcgeCA9ICgobG9uZylxLm0gPDwgOCkgKyBxLmY7CiAgICByZXR1cm4geCAvIDI1Ni4wOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgaW50IGk7CiAgZm9yIChpID0gLTIqNDsgaSA8PSArMio0OyBpKyspCiAgewogICAgZG91YmxlIGQgPSBpIC8gNC4wOwogICAgUTE2XzggcSA9IHRvUShkKTsKICAgIGRvdWJsZSBkMiA9IHRvRG91YmxlKHEpOwogICAgcHJpbnRmKCJ0b0RvdWJsZSh0b1EoJWYpKSA9ICVmXG4iLCBkLCBkMik7CiAgfQogIHJldHVybiAwOwp9Cg==