in include/half.hpp [4012:4032]
inline half tgamma(half arg)
{
#if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
return half(detail::binary, detail::float2half<half::round_style>(std::tgamma(detail::half2float<detail::internal_t>(arg.data_))));
#else
unsigned int abs = arg.data_ & 0x7FFF;
if(!abs)
return half(detail::binary, detail::pole(arg.data_));
if(abs >= 0x7C00)
return (arg.data_==0x7C00) ? arg : half(detail::binary, detail::signal(arg.data_));
if(arg.data_ >= 0xE400 || (arg.data_ >= 0xBC00 && !(abs&((1<<(25-(abs>>10)))-1))))
return half(detail::binary, detail::invalid());
if(arg.data_ >= 0xCA80)
return half(detail::binary, detail::underflow<half::round_style>((1-((abs>>(25-(abs>>10)))&1))<<15));
if(arg.data_ <= 0x100 || (arg.data_ >= 0x4900 && arg.data_ < 0x8000))
return half(detail::binary, detail::overflow<half::round_style>());
if(arg.data_ == 0x3C00)
return arg;
return half(detail::binary, detail::gamma<half::round_style,false>(arg.data_));
#endif
}