как можно уместить 1.7754 в 3f 1a?
0x3f 0x1a -- это знак == 0, порядок == 0xf, мантисса == 0x31a. Нормализованное значение мантиссы == 1 + 0x31a / 1024 = 1.7754. Порядок 0xf после вычитания bias == 15 превращается в 0, что соответствует множителю 1. Всё.
Как число с плавающей точкой преобразовать в half float в 16 формат
Примерно так:
0) обработать специальные случаи (например 0 представляется как 0).
1) взять модуль, запомнить знак исходного числа.
2) нормализовать, т.е выделить множитель вида 2^N, чтобы осталась нормализованная мантисса в диапазоне [1, 2). К N прибавить 15 -- это значение порядка.
3) отнять 1 от нормализованной мантиссы, результат умножить на 1024 -- это значение мантиссы float16.
4) сдвинуть значение порядка влево на 10, сделать побитовое или с мантиссой float16, установить старший бит, если число было отрицательным.
Для -3.4805 получаем:
3.4805 = 2^1 * 1.7402 ; N = 1, M = 1024 * 0.7402 = 0x2f6 ;
0x8000 | ((1 + 15) << 10) | 0x2f6 = 0x8000 | 0x4000 | 0x2f6 = 0xc2f6