#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 / 256; // 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+Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBzaWduZWQgc2hvcnQgbTsKICAgIHVuc2lnbmVkIGNoYXIgZjsKfSBRMTZfODsKClExNl84IHRvUShkb3VibGUgZCkKewogICAgUTE2XzggcTsKICAgIGxvbmcgeCA9IGQgKiAyNTY7CiAgICBxLm0gPSB4IC8gMjU2OyAvLyB0aGlzIGFzc3VtZXMgPj4gdG8gYmUgYW4gYXJpdGhtZXRpYyBzaGlmdAogICAgcS5mID0geCAmIDB4RkY7IC8vIHRoaXMgYXNzdW1lcyBzaWduZWQgaW50cyB0byBiZSAyJ3MgY29tcGxlbWVudAogICAgcmV0dXJuIHE7Cn0KCmRvdWJsZSB0b0RvdWJsZShRMTZfOCBxKQp7CiAgICBsb25nIHggPSAoKGxvbmcpcS5tIDw8IDgpICsgcS5mOwogICAgcmV0dXJuIHggLyAyNTYuMDsKfQoKaW50IG1haW4odm9pZCkKewogIGludCBpOwogIGZvciAoaSA9IC0yKjQ7IGkgPD0gKzIqNDsgaSsrKQogIHsKICAgIGRvdWJsZSBkID0gaSAvIDQuMDsKICAgIFExNl84IHEgPSB0b1EoZCk7CiAgICBkb3VibGUgZDIgPSB0b0RvdWJsZShxKTsKICAgIHByaW50ZigidG9Eb3VibGUodG9RKCVmKSkgPSAlZlxuIiwgZCwgZDIpOwogIH0KICByZXR1cm4gMDsKfQo=