in include/half.hpp [1317:1344]
template<std::float_round_style R,bool E,bool I,typename T> T half2int(unsigned int value)
{
unsigned int abs = value & 0x7FFF;
if(abs >= 0x7C00)
{
raise(FE_INVALID);
return (value&0x8000) ? std::numeric_limits<T>::min() : std::numeric_limits<T>::max();
}
if(abs < 0x3800)
{
raise(FE_INEXACT, I);
return (R==std::round_toward_infinity) ? T(~(value>>15)&(abs!=0)) :
(R==std::round_toward_neg_infinity) ? -T(value>0x8000) :
T();
}
int exp = 25 - (abs>>10);
unsigned int m = (value&0x3FF) | 0x400;
int32 i = static_cast<int32>((exp<=0) ? (m<<-exp) : ((m+(
(R==std::round_to_nearest) ? ((1<<(exp-1))-(~(m>>exp)&E)) :
(R==std::round_toward_infinity) ? (((1<<exp)-1)&((value>>15)-1)) :
(R==std::round_toward_neg_infinity) ? (((1<<exp)-1)&-(value>>15)) : 0))>>exp));
if((!std::numeric_limits<T>::is_signed && (value&0x8000)) || (std::numeric_limits<T>::digits<16 &&
((value&0x8000) ? (-i<std::numeric_limits<T>::min()) : (i>std::numeric_limits<T>::max()))))
raise(FE_INVALID);
else if(I && exp > 0 && (m&((1<<exp)-1)))
raise(FE_INEXACT);
return static_cast<T>((value&0x8000) ? -i : i);
}