#include <stdio.h>
unsigned int2hfloat(int x)
{
unsigned sign = x < 0;
unsigned absx = ((unsigned)x ^ -sign) + sign; // safe abs(x)
unsigned tmp = absx, manbits = 0;
int exp = 0, truncated
= 0;
// calculate the number of bits needed for the mantissa
while (tmp)
{
tmp >>= 1;
manbits++;
}
// round the number if necessary before we do the conversion
if (manbits > 13)
absx += (2<<(manbits-13));
manbits = 0;
tmp = absx;
while (tmp)
{
tmp >>= 1;
manbits++;
}
// half-precision floats have 11 bits in the mantissa.
// truncate the excess or insert the lacking 0s until there are 11.
if (manbits)
{
exp = 10; // exp bias because 1.0 is at bit position 10 while (manbits > 11)
{
truncated |= absx & 1;
absx >>= 1;
manbits--;
}
while (manbits < 11)
{
absx <<= 1;
manbits++;
exp--;
}
}
if (exp + truncated
> 16) {
// absx was too big, force it to +/- infinity
exp = 31; // special infinity value absx = 0;
}
else if (manbits)
{
// normal case, absx > 0
exp += 15; // bias the exponent }
return (sign
<< 15) | ((unsigned)exp << 10) | (absx
& ((1u
<<10)-1)); }
int main(void)
{
printf("+4095: 0x%04X\n", int2hfloat
(+4095)); printf("+4096: 0x%04X\n", int2hfloat
(+4096)); printf("+4097: 0x%04X\n", int2hfloat
(+4097)); printf("+4098: 0x%04X\n", int2hfloat
(+4098)); printf("+4099: 0x%04X\n", int2hfloat
(+4099)); printf("+2052: 0x%04X\n", int2hfloat
(+2052)); printf("+8190: 0x%04X\n", int2hfloat
(+8190)); printf("+8191: 0x%04X\n", int2hfloat
(+8191)); printf("+8192: 0x%04X\n", int2hfloat
(+8192)); printf("+8193: 0x%04X\n", int2hfloat
(+8193)); printf("+8194: 0x%04X\n", int2hfloat
(+8194)); printf("+8195: 0x%04X\n", int2hfloat
(+8195)); printf("+8196: 0x%04X\n", int2hfloat
(+8196)); printf("+8197: 0x%04X\n", int2hfloat
(+8197)); printf("+8198: 0x%04X\n", int2hfloat
(+8198)); printf("+8199: 0x%04X\n", int2hfloat
(+8199)); printf("+8200: 0x%04X\n", int2hfloat
(+8200)); printf("+16398: 0x%04X\n", int2hfloat
(+16398)); printf("+16400: 0x%04X\n", int2hfloat
(+16400)); printf("+32768: 0x%04X\n", int2hfloat
(+32768)); printf("+65504: 0x%04X\n", int2hfloat
(+65504)); printf("+65505: 0x%04X\n", int2hfloat
(+65505)); printf("+65519: 0x%04X\n", int2hfloat
(+65519)); printf("+65534: 0x%04X\n", int2hfloat
(+65534)); printf("+65535: 0x%04X\n", int2hfloat
(+65535)); printf("+65535: 0x%04X\n", int2hfloat
(+65536)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp1bnNpZ25lZCBpbnQyaGZsb2F0KGludCB4KQp7CiAgdW5zaWduZWQgc2lnbiA9IHggPCAwOwogIHVuc2lnbmVkIGFic3ggPSAoKHVuc2lnbmVkKXggXiAtc2lnbikgKyBzaWduOyAvLyBzYWZlIGFicyh4KQogIHVuc2lnbmVkIHRtcCA9IGFic3gsIG1hbmJpdHMgPSAwOwogIGludCBleHAgPSAwLCB0cnVuY2F0ZWQgPSAwOwoKICAvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hbnRpc3NhCiAgd2hpbGUgKHRtcCkKICB7CiAgICB0bXAgPj49IDE7CiAgICBtYW5iaXRzKys7CiAgfQoKICAvLyByb3VuZCB0aGUgbnVtYmVyIGlmIG5lY2Vzc2FyeSBiZWZvcmUgd2UgZG8gdGhlIGNvbnZlcnNpb24KICBpZiAobWFuYml0cyA+IDEzKQogICAgYWJzeCArPSAoMjw8KG1hbmJpdHMtMTMpKTsKCiAgbWFuYml0cyA9IDA7CiAgdG1wID0gYWJzeDsKICB3aGlsZSAodG1wKQogIHsKICAgIHRtcCA+Pj0gMTsKICAgIG1hbmJpdHMrKzsKICB9CgogIC8vIGhhbGYtcHJlY2lzaW9uIGZsb2F0cyBoYXZlIDExIGJpdHMgaW4gdGhlIG1hbnRpc3NhLgogIC8vIHRydW5jYXRlIHRoZSBleGNlc3Mgb3IgaW5zZXJ0IHRoZSBsYWNraW5nIDBzIHVudGlsIHRoZXJlIGFyZSAxMS4KICBpZiAobWFuYml0cykKICB7CiAgICBleHAgPSAxMDsgLy8gZXhwIGJpYXMgYmVjYXVzZSAxLjAgaXMgYXQgYml0IHBvc2l0aW9uIDEwCiAgICB3aGlsZSAobWFuYml0cyA+IDExKQogICAgewogICAgICB0cnVuY2F0ZWQgfD0gYWJzeCAmIDE7CiAgICAgIGFic3ggPj49IDE7CiAgICAgIG1hbmJpdHMtLTsKICAgICAgZXhwKys7CiAgICB9CiAgICB3aGlsZSAobWFuYml0cyA8IDExKQogICAgewogICAgICBhYnN4IDw8PSAxOwogICAgICBtYW5iaXRzKys7CiAgICAgIGV4cC0tOwogICAgfQogIH0KICBpZiAoZXhwICsgdHJ1bmNhdGVkID4gMTYpCiAgewogICAgLy8gYWJzeCB3YXMgdG9vIGJpZywgZm9yY2UgaXQgdG8gKy8tIGluZmluaXR5CiAgICBleHAgPSAzMTsgLy8gc3BlY2lhbCBpbmZpbml0eSB2YWx1ZQogICAgYWJzeCA9IDA7CiAgfQogIGVsc2UgaWYgKG1hbmJpdHMpCiAgewogICAgLy8gbm9ybWFsIGNhc2UsIGFic3ggPiAwCiAgICBleHAgKz0gMTU7IC8vIGJpYXMgdGhlIGV4cG9uZW50CiAgfQoKICByZXR1cm4gKHNpZ24gPDwgMTUpIHwgKCh1bnNpZ25lZClleHAgPDwgMTApIHwgKGFic3ggJiAoKDF1PDwxMCktMSkpOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgcHJpbnRmKCIrNDA5NTogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs0MDk1KSk7CiAgcHJpbnRmKCIrNDA5NjogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs0MDk2KSk7CiAgcHJpbnRmKCIrNDA5NzogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs0MDk3KSk7CiAgcHJpbnRmKCIrNDA5ODogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs0MDk4KSk7CiAgcHJpbnRmKCIrNDA5OTogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs0MDk5KSk7CiAgcHJpbnRmKCIrMjA1MjogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCsyMDUyKSk7CiAgcHJpbnRmKCIrODE5MDogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs4MTkwKSk7CiAgcHJpbnRmKCIrODE5MTogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs4MTkxKSk7CiAgcHJpbnRmKCIrODE5MjogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs4MTkyKSk7CiAgcHJpbnRmKCIrODE5MzogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs4MTkzKSk7CiAgcHJpbnRmKCIrODE5NDogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs4MTk0KSk7CiAgcHJpbnRmKCIrODE5NTogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs4MTk1KSk7CiAgcHJpbnRmKCIrODE5NjogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs4MTk2KSk7CiAgcHJpbnRmKCIrODE5NzogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs4MTk3KSk7CiAgcHJpbnRmKCIrODE5ODogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs4MTk4KSk7CiAgcHJpbnRmKCIrODE5OTogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs4MTk5KSk7CiAgcHJpbnRmKCIrODIwMDogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs4MjAwKSk7CiAgcHJpbnRmKCIrMTYzOTg6IDB4JTA0WFxuIiwgaW50MmhmbG9hdCgrMTYzOTgpKTsKICBwcmludGYoIisxNjQwMDogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCsxNjQwMCkpOwogIHByaW50ZigiKzMyNzY4OiAweCUwNFhcbiIsIGludDJoZmxvYXQoKzMyNzY4KSk7CiAgcHJpbnRmKCIrNjU1MDQ6IDB4JTA0WFxuIiwgaW50MmhmbG9hdCgrNjU1MDQpKTsKICBwcmludGYoIis2NTUwNTogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs2NTUwNSkpOwogIHByaW50ZigiKzY1NTE5OiAweCUwNFhcbiIsIGludDJoZmxvYXQoKzY1NTE5KSk7CiAgcHJpbnRmKCIrNjU1MzQ6IDB4JTA0WFxuIiwgaW50MmhmbG9hdCgrNjU1MzQpKTsKICBwcmludGYoIis2NTUzNTogMHglMDRYXG4iLCBpbnQyaGZsb2F0KCs2NTUzNSkpOwogIHByaW50ZigiKzY1NTM1OiAweCUwNFhcbiIsIGludDJoZmxvYXQoKzY1NTM2KSk7CiAgcmV0dXJuIDA7Cn0K