inline half tgamma()

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
	}