#include <limits.h>
#include <string.h>
#include <stdio.h>
#define C_ASSERT(expr) extern char CAssertExtern[(expr)?1:-1]
C_ASSERT(CHAR_BIT == 8);
C_ASSERT(sizeof(float) == 4);
C_ASSERT(sizeof(int) == 4);
float div(int x
, unsigned n
) {
float res;
unsigned e = 0;
unsigned sign = x < 0;
unsigned m = sign ? -x : x;
if (m)
{
while (m >= (1u << 24))
m >>= 1, e++;
while (m < (1u << 23))
m <<= 1, e--;
e += 0x7F + 23;
e -= n; // divide by 1<<n
m ^= 1u << 23; // reset the implicit 1
m |= (e & 0xFF) << 23; // mix in the exponent
m |= sign << 31; // mix in the sign
}
return res;
}
void Print4Bytes(unsigned char buf[4])
{
printf("%02X%02X%02X%02X ", buf
[3], buf
[2], buf
[1], buf
[0]); }
int main(void)
{
int x = 0x35AA53;
int n;
for (n = 0; n < 31; n++)
{
float v1 = (float)x/(1u << n);
Print4Bytes((void*)&v1);
Print4Bytes((void*)&v2);
printf("%14.6f %14.6f\n", v1
, v2
); }
return 0;
}
I2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgogCiNkZWZpbmUgQ19BU1NFUlQoZXhwcikgZXh0ZXJuIGNoYXIgQ0Fzc2VydEV4dGVyblsoZXhwcik/MTotMV0KIApDX0FTU0VSVChDSEFSX0JJVCA9PSA4KTsKQ19BU1NFUlQoc2l6ZW9mKGZsb2F0KSA9PSA0KTsKQ19BU1NFUlQoc2l6ZW9mKGludCkgPT0gNCk7CiAKZmxvYXQgZGl2KGludCB4LCB1bnNpZ25lZCBuKQp7CiAgZmxvYXQgcmVzOwogIHVuc2lnbmVkIGUgPSAwOwogIHVuc2lnbmVkIHNpZ24gPSB4IDwgMDsKICB1bnNpZ25lZCBtID0gc2lnbiA/IC14IDogeDsgIAogCiAgaWYgKG0pCiAgewogICAgd2hpbGUgKG0gPj0gKDF1IDw8IDI0KSkKICAgICAgbSA+Pj0gMSwgZSsrOwogCiAgICB3aGlsZSAobSA8ICgxdSA8PCAyMykpCiAgICAgIG0gPDw9IDEsIGUtLTsKIAogICAgZSArPSAweDdGICsgMjM7CiAKICAgIGUgLT0gbjsgLy8gZGl2aWRlIGJ5IDE8PG4KIAogICAgbSBePSAxdSA8PCAyMzsgLy8gcmVzZXQgdGhlIGltcGxpY2l0IDEKCiAgICBtIHw9IChlICYgMHhGRikgPDwgMjM7IC8vIG1peCBpbiB0aGUgZXhwb25lbnQKIAogICAgbSB8PSBzaWduIDw8IDMxOyAvLyBtaXggaW4gdGhlIHNpZ24KICB9CiAKICBtZW1jcHkoJnJlcywgJm0sIHNpemVvZiBtKTsKIAogIHJldHVybiByZXM7Cn0KIAp2b2lkIFByaW50NEJ5dGVzKHVuc2lnbmVkIGNoYXIgYnVmWzRdKQp7CiAgcHJpbnRmKCIlMDJYJTAyWCUwMlglMDJYICIsIGJ1ZlszXSwgYnVmWzJdLCBidWZbMV0sIGJ1ZlswXSk7Cn0KIAppbnQgbWFpbih2b2lkKQp7CiAgaW50IHggPSAweDM1QUE1MzsKICBpbnQgbjsKICBmb3IgKG4gPSAwOyBuIDwgMzE7IG4rKykKICB7CiAgICBmbG9hdCB2MSA9IChmbG9hdCl4LygxdSA8PCBuKTsKICAgIGZsb2F0IHYyID0gZGl2KHgsIG4pOwogICAgUHJpbnQ0Qnl0ZXMoKHZvaWQqKSZ2MSk7CiAgICBwcmludGYoIiVjPSAiLCAiIT0iW21lbWNtcCgmdjEsICZ2Miwgc2l6ZW9mIHYxKSA9PSAwXSk7CiAgICBQcmludDRCeXRlcygodm9pZCopJnYyKTsKICAgIHByaW50ZigiJTE0LjZmICUxNC42ZlxuIiwgdjEsIHYyKTsKICB9CiAgcmV0dXJuIDA7Cn0K