Как сохранить максимальное число float16 в формате float32?
65504
Вы можете просто преобразовать целое число в число с плавающей точкой:
float half_max = 65504;
Если вы хотите вычислить значение, вы можете использовать ldexpf
:
float half_max = (2 - ldexpf(1, -10)) * ldexpf(1, 15)
Или, как правило, для любого числа с плавающей запятой IEEE:
// in case of half float
int bits = 16;
int man_bits = 10;
// the calculation
int exp_bits = bits - man_bits - 1;
int exp_max = (1 << (exp_bits - 1)) - 1;
long double max = (2 - ldexp(1, -1 * man_bits)) * ldexp(1, exp_max);
Преобразование битов 0x7bff не работает, потому что 0x7bff - это представление в формате binary16 (в некотором порядке байтов), а не в формате binary32. Вы не можете разыгрывать конфликтующие представления.