in include/half.hpp [3167:3202]
inline half log1p(half arg)
{
#if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
return half(detail::binary, detail::float2half<half::round_style>(std::log1p(detail::half2float<detail::internal_t>(arg.data_))));
#else
if(arg.data_ >= 0xBC00)
return half(detail::binary, (arg.data_==0xBC00) ? detail::pole(0x8000) : (arg.data_<=0xFC00) ? detail::invalid() : detail::signal(arg.data_));
int abs = arg.data_ & 0x7FFF, exp = -15;
if(!abs || abs >= 0x7C00)
return (abs>0x7C00) ? half(detail::binary, detail::signal(arg.data_)) : arg;
for(; abs<0x400; abs<<=1,--exp) ;
exp += abs >> 10;
detail::uint32 m = static_cast<detail::uint32>((abs&0x3FF)|0x400) << 20;
if(arg.data_ & 0x8000)
{
m = 0x40000000 - (m>>-exp);
for(exp=0; m<0x40000000; m<<=1,--exp) ;
}
else
{
if(exp < 0)
{
m = 0x40000000 + (m>>-exp);
exp = 0;
}
else
{
m += 0x40000000 >> exp;
int i = m >> 31;
m >>= i;
exp += i;
}
}
return half(detail::binary, detail::log2_post<half::round_style,0xB8AA3B2A>(detail::log2(m), exp, 17));
#endif
}