Как показано в ответе Ботье , достаточно скопировать верхнюю половину значения float
, поскольку битовые комбинации одинаковы.То, как это делается в этом ответе, нарушает правила строгого наложения имен в C ++.Чтобы обойти это, используйте memcpy
для копирования битов.
static inline tensorflow::bfloat16 FloatToBFloat16(float float_val)
{
tensorflow::bfloat16 retval;
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
memcpy(&retval, &float_val, sizeof retval);
#else
memcpy(&retval, reinterpret_cast<char *>(&float_val) + sizeof float_val - sizeof retval, sizeof retval);
#endif
return retval;
}
Если необходимо округлить результат, а не обрезать его, вы можете умножить на магическое значение, чтобы вытолкнуть некоторые из этих младших битов.в верхние биты.
float_val *= 1.001957f;