// half - IEEE 754-based half-precision floating point library.
//
// Copyright (c) 2012-2017 Christian Rau <rauy@users.sourceforge.net>
//
// SPDX-License-Identifier: MIT
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

// Version 1.12.0

/// \file
/// Main header file for half precision functionality.

#ifndef HALF_HALF_HPP
#define HALF_HALF_HPP

/// Combined gcc version number.
#define HALF_GNUC_VERSION (__GNUC__*100+__GNUC_MINOR__)

//check C++11 language features
#if defined(__clang__)										//clang
	#if __has_feature(cxx_static_assert) && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
		#define HALF_ENABLE_CPP11_STATIC_ASSERT 1
	#endif
	#if __has_feature(cxx_constexpr) && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
		#define HALF_ENABLE_CPP11_CONSTEXPR 1
	#endif
	#if __has_feature(cxx_noexcept) && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
		#define HALF_ENABLE_CPP11_NOEXCEPT 1
	#endif
	#if __has_feature(cxx_user_literals) && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
		#define HALF_ENABLE_CPP11_USER_LITERALS 1
	#endif
	#if (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L) && !defined(HALF_ENABLE_CPP11_LONG_LONG)
		#define HALF_ENABLE_CPP11_LONG_LONG 1
	#endif
/*#elif defined(__INTEL_COMPILER)								//Intel C++
	#if __INTEL_COMPILER >= 1100 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)		????????
		#define HALF_ENABLE_CPP11_STATIC_ASSERT 1
	#endif
	#if __INTEL_COMPILER >= 1300 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)			????????
		#define HALF_ENABLE_CPP11_CONSTEXPR 1
	#endif
	#if __INTEL_COMPILER >= 1300 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)			????????
		#define HALF_ENABLE_CPP11_NOEXCEPT 1
	#endif
	#if __INTEL_COMPILER >= 1100 && !defined(HALF_ENABLE_CPP11_LONG_LONG)			????????
		#define HALF_ENABLE_CPP11_LONG_LONG 1
	#endif*/
#elif defined(__GNUC__)										//gcc
	#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
		#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
			#define HALF_ENABLE_CPP11_STATIC_ASSERT 1
		#endif
		#if HALF_GNUC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
			#define HALF_ENABLE_CPP11_CONSTEXPR 1
		#endif
		#if HALF_GNUC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
			#define HALF_ENABLE_CPP11_NOEXCEPT 1
		#endif
		#if HALF_GNUC_VERSION >= 407 && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
			#define HALF_ENABLE_CPP11_USER_LITERALS 1
		#endif
		#if !defined(HALF_ENABLE_CPP11_LONG_LONG)
			#define HALF_ENABLE_CPP11_LONG_LONG 1
		#endif
	#endif
#elif defined(_MSC_VER)										//Visual C++
	#if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
		#define HALF_ENABLE_CPP11_CONSTEXPR 1
	#endif
	#if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
		#define HALF_ENABLE_CPP11_NOEXCEPT 1
	#endif
	#if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
		#define HALF_ENABLE_CPP11_USER_LITERALS 1
	#endif
	#if _MSC_VER >= 1600 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
		#define HALF_ENABLE_CPP11_STATIC_ASSERT 1
	#endif
	#if _MSC_VER >= 1310 && !defined(HALF_ENABLE_CPP11_LONG_LONG)
		#define HALF_ENABLE_CPP11_LONG_LONG 1
	#endif
	#define HALF_POP_WARNINGS 1
	#pragma warning(push)
	#pragma warning(disable : 4099 4127 4146)	//struct vs class, constant in if, negative unsigned
#endif

//check C++11 library features
#include <utility>
#if defined(_LIBCPP_VERSION)								//libc++
	#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103
		#ifndef HALF_ENABLE_CPP11_TYPE_TRAITS
			#define HALF_ENABLE_CPP11_TYPE_TRAITS 1
		#endif
		#ifndef HALF_ENABLE_CPP11_CSTDINT
			#define HALF_ENABLE_CPP11_CSTDINT 1
		#endif
		#ifndef HALF_ENABLE_CPP11_CMATH
			#define HALF_ENABLE_CPP11_CMATH 1
		#endif
		#ifndef HALF_ENABLE_CPP11_HASH
			#define HALF_ENABLE_CPP11_HASH 1
		#endif
	#endif
#elif defined(__GLIBCXX__)									//libstdc++
	#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103
		#ifdef __clang__
			#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_TYPE_TRAITS)
				#define HALF_ENABLE_CPP11_TYPE_TRAITS 1
			#endif
			#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CSTDINT)
				#define HALF_ENABLE_CPP11_CSTDINT 1
			#endif
			#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CMATH)
				#define HALF_ENABLE_CPP11_CMATH 1
			#endif
			#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_HASH)
				#define HALF_ENABLE_CPP11_HASH 1
			#endif
		#else
			#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CSTDINT)
				#define HALF_ENABLE_CPP11_CSTDINT 1
			#endif
			#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CMATH)
				#define HALF_ENABLE_CPP11_CMATH 1
			#endif
			#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_HASH)
				#define HALF_ENABLE_CPP11_HASH 1
			#endif
		#endif
	#endif
#elif defined(_CPPLIB_VER)									//Dinkumware/Visual C++
	#if _CPPLIB_VER >= 520
		#ifndef HALF_ENABLE_CPP11_TYPE_TRAITS
			#define HALF_ENABLE_CPP11_TYPE_TRAITS 1
		#endif
		#ifndef HALF_ENABLE_CPP11_CSTDINT
			#define HALF_ENABLE_CPP11_CSTDINT 1
		#endif
		#ifndef HALF_ENABLE_CPP11_HASH
			#define HALF_ENABLE_CPP11_HASH 1
		#endif
	#endif
	#if _CPPLIB_VER >= 610
		#ifndef HALF_ENABLE_CPP11_CMATH
			#define HALF_ENABLE_CPP11_CMATH 1
		#endif
	#endif
#endif
#undef HALF_GNUC_VERSION

//support constexpr
#if HALF_ENABLE_CPP11_CONSTEXPR
	#define HALF_CONSTEXPR			constexpr
	#define HALF_CONSTEXPR_CONST	constexpr
#else
	#define HALF_CONSTEXPR
	#define HALF_CONSTEXPR_CONST	const
#endif

//support noexcept
#if HALF_ENABLE_CPP11_NOEXCEPT
	#define HALF_NOEXCEPT	noexcept
	#define HALF_NOTHROW	noexcept
#else
	#define HALF_NOEXCEPT
	#define HALF_NOTHROW	throw()
#endif

#include <algorithm>
#include <iostream>
#include <limits>
#include <climits>
#include <cmath>
#include <cstring>
#include <cstdlib>
#if HALF_ENABLE_CPP11_TYPE_TRAITS
	#include <type_traits>
#endif
#if HALF_ENABLE_CPP11_CSTDINT
	#include <cstdint>
#endif
#if HALF_ENABLE_CPP11_HASH
	#include <functional>
#endif


/// Default rounding mode.
/// This specifies the rounding mode used for all conversions between [half](\ref half_float::half)s and `float`s as well as
/// for the half_cast() if not specifying a rounding mode explicitly. It can be redefined (before including half.hpp) to one
/// of the standard rounding modes using their respective constants or the equivalent values of `std::float_round_style`:
///
/// `std::float_round_style`         | value | rounding
/// ---------------------------------|-------|-------------------------
/// `std::round_indeterminate`       | -1    | fastest (default)
/// `std::round_toward_zero`         | 0     | toward zero
/// `std::round_to_nearest`          | 1     | to nearest
/// `std::round_toward_infinity`     | 2     | toward positive infinity
/// `std::round_toward_neg_infinity` | 3     | toward negative infinity
///
/// By default this is set to `-1` (`std::round_indeterminate`), which uses truncation (round toward zero, but with overflows
/// set to infinity) and is the fastest rounding mode possible. It can even be set to `std::numeric_limits<float>::round_style`
/// to synchronize the rounding mode with that of the underlying single-precision implementation.
#ifndef HALF_ROUND_STYLE
	#define HALF_ROUND_STYLE	-1			// = std::round_indeterminate
#endif

/// Tie-breaking behaviour for round to nearest.
/// This specifies if ties in round to nearest should be resolved by rounding to the nearest even value. By default this is
/// defined to `0` resulting in the faster but slightly more biased behaviour of rounding away from zero in half-way cases (and
/// thus equal to the round() function), but can be redefined to `1` (before including half.hpp) if more IEEE-conformant
/// behaviour is needed.
#ifndef HALF_ROUND_TIES_TO_EVEN
	#define HALF_ROUND_TIES_TO_EVEN	0		// ties away from zero
#endif

/// Value signaling overflow.
/// In correspondence with `HUGE_VAL[F|L]` from `<cmath>` this symbol expands to a positive value signaling the overflow of an
/// operation, in particular it just evaluates to positive infinity.
#define HUGE_VALH	std::numeric_limits<half_float::half>::infinity()

/// Fast half-precision fma function.
/// This symbol is only defined if the fma() function generally executes as fast as, or faster than, a separate
/// half-precision multiplication followed by an addition. Due to the internal single-precision implementation of all
/// arithmetic operations, this is in fact always the case.
#define FP_FAST_FMAH	1

#ifndef FP_ILOGB0
	#define FP_ILOGB0		INT_MIN
#endif
#ifndef FP_ILOGBNAN
	#define FP_ILOGBNAN		INT_MAX
#endif
#ifndef FP_SUBNORMAL
	#define FP_SUBNORMAL	0
#endif
#ifndef FP_ZERO
	#define FP_ZERO			1
#endif
#ifndef FP_NAN
	#define FP_NAN			2
#endif
#ifndef FP_INFINITE
	#define FP_INFINITE		3
#endif
#ifndef FP_NORMAL
	#define FP_NORMAL		4
#endif


/// Main namespace for half precision functionality.
/// This namespace contains all the functionality provided by the library.
namespace half_float
{
	class half;

#if HALF_ENABLE_CPP11_USER_LITERALS
	/// Library-defined half-precision literals.
	/// Import this namespace to enable half-precision floating point literals:
	/// ~~~~{.cpp}
	/// using namespace half_float::literal;
	/// half_float::half = 4.2_h;
	/// ~~~~
	namespace literal
	{
		half operator""_h(long double);
	}
#endif

	/// \internal
	/// \brief Implementation details.
	namespace detail
	{
	#if HALF_ENABLE_CPP11_TYPE_TRAITS
		/// Conditional type.
		template<bool B,typename T,typename F> struct conditional : std::conditional<B,T,F> {};

		/// Helper for tag dispatching.
		template<bool B> struct bool_type : std::integral_constant<bool,B> {};
		using std::true_type;
		using std::false_type;

		/// Type traits for floating point types.
		template<typename T> struct is_float : std::is_floating_point<T> {};
	#else
		/// Conditional type.
		template<bool,typename T,typename> struct conditional { typedef T type; };
		template<typename T,typename F> struct conditional<false,T,F> { typedef F type; };

		/// Helper for tag dispatching.
		template<bool> struct bool_type {};
		typedef bool_type<true> true_type;
		typedef bool_type<false> false_type;

		/// Type traits for floating point types.
		template<typename> struct is_float : false_type {};
		template<typename T> struct is_float<const T> : is_float<T> {};
		template<typename T> struct is_float<volatile T> : is_float<T> {};
		template<typename T> struct is_float<const volatile T> : is_float<T> {};
		template<> struct is_float<float> : true_type {};
		template<> struct is_float<double> : true_type {};
		template<> struct is_float<long double> : true_type {};
	#endif

		/// Type traits for floating point bits.
		template<typename T> struct bits { typedef unsigned char type; };
		template<typename T> struct bits<const T> : bits<T> {};
		template<typename T> struct bits<volatile T> : bits<T> {};
		template<typename T> struct bits<const volatile T> : bits<T> {};

	#if HALF_ENABLE_CPP11_CSTDINT
		/// Unsigned integer of (at least) 16 bits width.
		typedef std::uint_least16_t uint16;

		/// Unsigned integer of (at least) 32 bits width.
		template<> struct bits<float> { typedef std::uint_least32_t type; };

		/// Unsigned integer of (at least) 64 bits width.
		template<> struct bits<double> { typedef std::uint_least64_t type; };
	#else
		/// Unsigned integer of (at least) 16 bits width.
		typedef unsigned short uint16;

		/// Unsigned integer of (at least) 32 bits width.
		template<> struct bits<float> : conditional<std::numeric_limits<unsigned int>::digits>=32,unsigned int,unsigned long> {};

		#if HALF_ENABLE_CPP11_LONG_LONG
			/// Unsigned integer of (at least) 64 bits width.
			template<> struct bits<double> : conditional<std::numeric_limits<unsigned long>::digits>=64,unsigned long,unsigned long long> {};
		#else
			/// Unsigned integer of (at least) 64 bits width.
			template<> struct bits<double> { typedef unsigned long type; };
		#endif
	#endif

		/// Tag type for binary construction.
		struct binary_t {};

		/// Tag for binary construction.
		HALF_CONSTEXPR_CONST binary_t binary = binary_t();

		/// Temporary half-precision expression.
		/// This class represents a half-precision expression which just stores a single-precision value internally.
		struct expr
		{
			/// Conversion constructor.
			/// \param f single-precision value to convert
			explicit HALF_CONSTEXPR expr(float f) HALF_NOEXCEPT : value_(f) {}

			/// Conversion to single-precision.
			/// \return single precision value representing expression value
			HALF_CONSTEXPR operator float() const HALF_NOEXCEPT { return value_; }

		private:
			/// Internal expression value stored in single-precision.
			float value_;
		};

		/// SFINAE helper for generic half-precision functions.
		/// This class template has to be specialized for each valid combination of argument types to provide a corresponding
		/// `type` member equivalent to \a T.
		/// \tparam T type to return
		template<typename T,typename,typename=void,typename=void> struct enable {};
		template<typename T> struct enable<T,half,void,void> { typedef T type; };
		template<typename T> struct enable<T,expr,void,void> { typedef T type; };
		template<typename T> struct enable<T,half,half,void> { typedef T type; };
		template<typename T> struct enable<T,half,expr,void> { typedef T type; };
		template<typename T> struct enable<T,expr,half,void> { typedef T type; };
		template<typename T> struct enable<T,expr,expr,void> { typedef T type; };
		template<typename T> struct enable<T,half,half,half> { typedef T type; };
		template<typename T> struct enable<T,half,half,expr> { typedef T type; };
		template<typename T> struct enable<T,half,expr,half> { typedef T type; };
		template<typename T> struct enable<T,half,expr,expr> { typedef T type; };
		template<typename T> struct enable<T,expr,half,half> { typedef T type; };
		template<typename T> struct enable<T,expr,half,expr> { typedef T type; };
		template<typename T> struct enable<T,expr,expr,half> { typedef T type; };
		template<typename T> struct enable<T,expr,expr,expr> { typedef T type; };

		/// Return type for specialized generic 2-argument half-precision functions.
		/// This class template has to be specialized for each valid combination of argument types to provide a corresponding 
		/// `type` member denoting the appropriate return type.
		/// \tparam T first argument type
		/// \tparam U first argument type
		template<typename T,typename U> struct result : enable<expr,T,U> {};
		template<> struct result<half,half> { typedef half type; };

		/// \name Classification helpers
		/// \{

		/// Check for infinity.
		/// \tparam T argument type (builtin floating point type)
		/// \param arg value to query
		/// \retval true if infinity
		/// \retval false else
		template<typename T> bool builtin_isinf(T arg)
		{
		#if HALF_ENABLE_CPP11_CMATH
			return std::isinf(arg);
		#elif defined(_MSC_VER)
			return !::_finite(static_cast<double>(arg)) && !::_isnan(static_cast<double>(arg));
		#else
			return arg == std::numeric_limits<T>::infinity() || arg == -std::numeric_limits<T>::infinity();
		#endif
		}

		/// Check for NaN.
		/// \tparam T argument type (builtin floating point type)
		/// \param arg value to query
		/// \retval true if not a number
		/// \retval false else
		template<typename T> bool builtin_isnan(T arg)
		{
		#if HALF_ENABLE_CPP11_CMATH
			return std::isnan(arg);
		#elif defined(_MSC_VER)
			return ::_isnan(static_cast<double>(arg)) != 0;
		#else
			return arg != arg;
		#endif
		}

		/// Check sign.
		/// \tparam T argument type (builtin floating point type)
		/// \param arg value to query
		/// \retval true if signbit set
		/// \retval false else
		template<typename T> bool builtin_signbit(T arg)
		{
		#if HALF_ENABLE_CPP11_CMATH
			return std::signbit(arg);
		#else
			return arg < T() || (arg == T() && T(1)/arg < T());
		#endif
		}

		/// \}
		/// \name Conversion
		/// \{

		/// Convert IEEE single-precision to half-precision.
		/// Credit for this goes to [Jeroen van der Zijp](ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf).
		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
		/// \param value single-precision value
		/// \return binary representation of half-precision value
		template<std::float_round_style R> uint16 float2half_impl(float value, true_type)
		{
			typedef bits<float>::type uint32;
			uint32 bits;// = *reinterpret_cast<uint32*>(&value);		//violating strict aliasing!
			std::memcpy(&bits, &value, sizeof(float));
/*			uint16 hbits = (bits>>16) & 0x8000;
			bits &= 0x7FFFFFFF;
			int exp = bits >> 23;
			if(exp == 255)
				return hbits | 0x7C00 | (0x3FF&-static_cast<unsigned>((bits&0x7FFFFF)!=0));
			if(exp > 142)
			{
				if(R == std::round_toward_infinity)
					return hbits | 0x7C00 - (hbits>>15);
				if(R == std::round_toward_neg_infinity)
					return hbits | 0x7BFF + (hbits>>15);
				return hbits | 0x7BFF + (R!=std::round_toward_zero);
			}
			int g, s;
			if(exp > 112)
			{
				g = (bits>>12) & 1;
				s = (bits&0xFFF) != 0;
				hbits |= ((exp-112)<<10) | ((bits>>13)&0x3FF);
			}
			else if(exp > 101)
			{
				int i = 125 - exp;
				bits = (bits&0x7FFFFF) | 0x800000;
				g = (bits>>i) & 1;
				s = (bits&((1L<<i)-1)) != 0;
				hbits |= bits >> (i+1);
			}
			else
			{
				g = 0;
				s = bits != 0;
			}
			if(R == std::round_to_nearest)
				#if HALF_ROUND_TIES_TO_EVEN
					hbits += g & (s|hbits);
				#else
					hbits += g;
				#endif
			else if(R == std::round_toward_infinity)
				hbits += ~(hbits>>15) & (s|g);
			else if(R == std::round_toward_neg_infinity)
				hbits += (hbits>>15) & (g|s);
*/			static const uint16 base_table[512] = { 
				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
				0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 
				0x0200, 0x0400, 0x0800, 0x0C00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x2400, 0x2800, 0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00, 
				0x4000, 0x4400, 0x4800, 0x4C00, 0x5000, 0x5400, 0x5800, 0x5C00, 0x6000, 0x6400, 0x6800, 0x6C00, 0x7000, 0x7400, 0x7800, 0x7C00, 
				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 
				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 
				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 
				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 
				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 
				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 
				0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 
				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
				0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001, 0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100, 
				0x8200, 0x8400, 0x8800, 0x8C00, 0x9000, 0x9400, 0x9800, 0x9C00, 0xA000, 0xA400, 0xA800, 0xAC00, 0xB000, 0xB400, 0xB800, 0xBC00, 
				0xC000, 0xC400, 0xC800, 0xCC00, 0xD000, 0xD400, 0xD800, 0xDC00, 0xE000, 0xE400, 0xE800, 0xEC00, 0xF000, 0xF400, 0xF800, 0xFC00, 
				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 
				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 
				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 
				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 
				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 
				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 
				0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00 };
			static const unsigned char shift_table[512] = { 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 
				13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 13, 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 
				13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
				24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 13 };
			uint16 hbits = base_table[bits>>23] + static_cast<uint16>((bits&0x7FFFFF)>>shift_table[bits>>23]);
			if(R == std::round_to_nearest)
				hbits += (((bits&0x7FFFFF)>>(shift_table[bits>>23]-1))|(((bits>>23)&0xFF)==102)) & ((hbits&0x7C00)!=0x7C00)
				#if HALF_ROUND_TIES_TO_EVEN
					& (((((static_cast<uint32>(1)<<(shift_table[bits>>23]-1))-1)&bits)!=0)|hbits)
				#endif
				;
			else if(R == std::round_toward_zero)
				hbits -= ((hbits&0x7FFF)==0x7C00) & ~shift_table[bits>>23];
			else if(R == std::round_toward_infinity)
				hbits += ((((bits&0x7FFFFF&((static_cast<uint32>(1)<<(shift_table[bits>>23]))-1))!=0)|(((bits>>23)<=102)&
					((bits>>23)!=0)))&(hbits<0x7C00)) - ((hbits==0xFC00)&((bits>>23)!=511));
			else if(R == std::round_toward_neg_infinity)
				hbits += ((((bits&0x7FFFFF&((static_cast<uint32>(1)<<(shift_table[bits>>23]))-1))!=0)|(((bits>>23)<=358)&
					((bits>>23)!=256)))&(hbits<0xFC00)&(hbits>>15)) - ((hbits==0x7C00)&((bits>>23)!=255));
			return hbits;
		}

		/// Convert IEEE double-precision to half-precision.
		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
		/// \param value double-precision value
		/// \return binary representation of half-precision value
		template<std::float_round_style R> uint16 float2half_impl(double value, true_type)
		{
			typedef bits<float>::type uint32;
			typedef bits<double>::type uint64;
			uint64 bits;// = *reinterpret_cast<uint64*>(&value);		//violating strict aliasing!
			std::memcpy(&bits, &value, sizeof(double));
			uint32 hi = bits >> 32, lo = bits & 0xFFFFFFFF;
			uint16 hbits = (hi>>16) & 0x8000;
			hi &= 0x7FFFFFFF;
			int exp = hi >> 20;
			if(exp == 2047)
				return hbits | 0x7C00 | (0x3FF&-static_cast<unsigned>((bits&0xFFFFFFFFFFFFF)!=0));
			if(exp > 1038)
			{
				if(R == std::round_toward_infinity)
					return hbits | 0x7C00 - (hbits>>15);
				if(R == std::round_toward_neg_infinity)
					return hbits | 0x7BFF + (hbits>>15);
				return hbits | 0x7BFF + (R!=std::round_toward_zero);
			}
			int g, s = lo != 0;
			if(exp > 1008)
			{
				g = (hi>>9) & 1;
				s |= (hi&0x1FF) != 0;
				hbits |= ((exp-1008)<<10) | ((hi>>10)&0x3FF);
			}
			else if(exp > 997)
			{
				int i = 1018 - exp;
				hi = (hi&0xFFFFF) | 0x100000;
				g = (hi>>i) & 1;
				s |= (hi&((1L<<i)-1)) != 0;
				hbits |= hi >> (i+1);
			}
			else
			{
				g = 0;
				s |= hi != 0;
			}
			if(R == std::round_to_nearest)
				#if HALF_ROUND_TIES_TO_EVEN
					hbits += g & (s|hbits);
				#else
					hbits += g;
				#endif
			else if(R == std::round_toward_infinity)
				hbits += ~(hbits>>15) & (s|g);
			else if(R == std::round_toward_neg_infinity)
				hbits += (hbits>>15) & (g|s);
			return hbits;
		}

		/// Convert non-IEEE floating point to half-precision.
		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
		/// \tparam T source type (builtin floating point type)
		/// \param value floating point value
		/// \return binary representation of half-precision value
		template<std::float_round_style R,typename T> uint16 float2half_impl(T value, ...)
		{
			uint16 hbits = static_cast<unsigned>(builtin_signbit(value)) << 15;
			if(value == T())
				return hbits;
			if(builtin_isnan(value))
				return hbits | 0x7FFF;
			if(builtin_isinf(value))
				return hbits | 0x7C00;
			int exp;
			std::frexp(value, &exp);
			if(exp > 16)
			{
				if(R == std::round_toward_infinity)
					return hbits | (0x7C00-(hbits>>15));
				else if(R == std::round_toward_neg_infinity)
					return hbits | (0x7BFF+(hbits>>15));
				return hbits | (0x7BFF+(R!=std::round_toward_zero));
			}
			if(exp < -13)
				value = std::ldexp(value, 24);
			else
			{
				value = std::ldexp(value, 11-exp);
				hbits |= ((exp+13)<<10);
			}
			T ival, frac = std::modf(value, &ival);
			hbits += static_cast<uint16>(std::abs(static_cast<int>(ival)));
			if(R == std::round_to_nearest)
			{
				frac = std::abs(frac);
				#if HALF_ROUND_TIES_TO_EVEN
					hbits += (frac>T(0.5)) | ((frac==T(0.5))&hbits);
				#else
					hbits += frac >= T(0.5);
				#endif
			}
			else if(R == std::round_toward_infinity)
				hbits += frac > T();
			else if(R == std::round_toward_neg_infinity)
				hbits += frac < T();
			return hbits;
		}

		/// Convert floating point to half-precision.
		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
		/// \tparam T source type (builtin floating point type)
		/// \param value floating point value
		/// \return binary representation of half-precision value
		template<std::float_round_style R,typename T> uint16 float2half(T value)
		{
			return float2half_impl<R>(value, bool_type<std::numeric_limits<T>::is_iec559&&sizeof(typename bits<T>::type)==sizeof(T)>());
		}

		/// Convert integer to half-precision floating point.
		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
		/// \tparam S `true` if value negative, `false` else
		/// \tparam T type to convert (builtin integer type)
		/// \param value non-negative integral value
		/// \return binary representation of half-precision value
		template<std::float_round_style R,bool S,typename T> uint16 int2half_impl(T value)
		{
		#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
			static_assert(std::is_integral<T>::value, "int to half conversion only supports builtin integer types");
		#endif
			if(S)
				value = -value;
			uint16 bits = S << 15;
			if(value > 0xFFFF)
			{
				if(R == std::round_toward_infinity)
					bits |= 0x7C00 - S;
				else if(R == std::round_toward_neg_infinity)
					bits |= 0x7BFF + S;
				else
					bits |= 0x7BFF + (R!=std::round_toward_zero);
			}
			else if(value)
			{
				unsigned int m = value, exp = 24;
				for(; m<0x400; m<<=1,--exp) ;
				for(; m>0x7FF; m>>=1,++exp) ;
				bits |= (exp<<10) + m;
				if(exp > 24)
				{
					if(R == std::round_to_nearest)
						bits += (value>>(exp-25)) & 1
						#if HALF_ROUND_TIES_TO_EVEN
							& (((((1<<(exp-25))-1)&value)!=0)|bits)
						#endif
						;
					else if(R == std::round_toward_infinity)
						bits += ((value&((1<<(exp-24))-1))!=0) & !S;
					else if(R == std::round_toward_neg_infinity)
						bits += ((value&((1<<(exp-24))-1))!=0) & S;
				}
			}
			return bits;
		}

		/// Convert integer to half-precision floating point.
		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
		/// \tparam T type to convert (builtin integer type)
		/// \param value integral value
		/// \return binary representation of half-precision value
		template<std::float_round_style R,typename T> uint16 int2half(T value)
		{
			return (value<0) ? int2half_impl<R,true>(value) : int2half_impl<R,false>(value);
		}

		/// Convert half-precision to IEEE single-precision.
		/// Credit for this goes to [Jeroen van der Zijp](ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf).
		/// \param value binary representation of half-precision value
		/// \return single-precision value
		inline float half2float_impl(uint16 value, float, true_type)
		{
			typedef bits<float>::type uint32;
/*			uint32 bits = static_cast<uint32>(value&0x8000) << 16;
			int abs = value & 0x7FFF;
			if(abs)
			{
				bits |= 0x38000000 << static_cast<unsigned>(abs>=0x7C00);
				for(; abs<0x400; abs<<=1,bits-=0x800000) ;
				bits += static_cast<uint32>(abs) << 13;
			}
*/			static const uint32 mantissa_table[2048] = { 
				0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34A00000, 0x34C00000, 0x34E00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000, 0x35400000, 0x35500000, 0x35600000, 0x35700000, 
				0x35800000, 0x35880000, 0x35900000, 0x35980000, 0x35A00000, 0x35A80000, 0x35B00000, 0x35B80000, 0x35C00000, 0x35C80000, 0x35D00000, 0x35D80000, 0x35E00000, 0x35E80000, 0x35F00000, 0x35F80000, 
				0x36000000, 0x36040000, 0x36080000, 0x360C0000, 0x36100000, 0x36140000, 0x36180000, 0x361C0000, 0x36200000, 0x36240000, 0x36280000, 0x362C0000, 0x36300000, 0x36340000, 0x36380000, 0x363C0000, 
				0x36400000, 0x36440000, 0x36480000, 0x364C0000, 0x36500000, 0x36540000, 0x36580000, 0x365C0000, 0x36600000, 0x36640000, 0x36680000, 0x366C0000, 0x36700000, 0x36740000, 0x36780000, 0x367C0000, 
				0x36800000, 0x36820000, 0x36840000, 0x36860000, 0x36880000, 0x368A0000, 0x368C0000, 0x368E0000, 0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369A0000, 0x369C0000, 0x369E0000, 
				0x36A00000, 0x36A20000, 0x36A40000, 0x36A60000, 0x36A80000, 0x36AA0000, 0x36AC0000, 0x36AE0000, 0x36B00000, 0x36B20000, 0x36B40000, 0x36B60000, 0x36B80000, 0x36BA0000, 0x36BC0000, 0x36BE0000, 
				0x36C00000, 0x36C20000, 0x36C40000, 0x36C60000, 0x36C80000, 0x36CA0000, 0x36CC0000, 0x36CE0000, 0x36D00000, 0x36D20000, 0x36D40000, 0x36D60000, 0x36D80000, 0x36DA0000, 0x36DC0000, 0x36DE0000, 
				0x36E00000, 0x36E20000, 0x36E40000, 0x36E60000, 0x36E80000, 0x36EA0000, 0x36EC0000, 0x36EE0000, 0x36F00000, 0x36F20000, 0x36F40000, 0x36F60000, 0x36F80000, 0x36FA0000, 0x36FC0000, 0x36FE0000, 
				0x37000000, 0x37010000, 0x37020000, 0x37030000, 0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000, 0x370A0000, 0x370B0000, 0x370C0000, 0x370D0000, 0x370E0000, 0x370F0000, 
				0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000, 0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371A0000, 0x371B0000, 0x371C0000, 0x371D0000, 0x371E0000, 0x371F0000, 
				0x37200000, 0x37210000, 0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000, 0x37280000, 0x37290000, 0x372A0000, 0x372B0000, 0x372C0000, 0x372D0000, 0x372E0000, 0x372F0000, 
				0x37300000, 0x37310000, 0x37320000, 0x37330000, 0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000, 0x373A0000, 0x373B0000, 0x373C0000, 0x373D0000, 0x373E0000, 0x373F0000, 
				0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000, 0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374A0000, 0x374B0000, 0x374C0000, 0x374D0000, 0x374E0000, 0x374F0000, 
				0x37500000, 0x37510000, 0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000, 0x37580000, 0x37590000, 0x375A0000, 0x375B0000, 0x375C0000, 0x375D0000, 0x375E0000, 0x375F0000, 
				0x37600000, 0x37610000, 0x37620000, 0x37630000, 0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000, 0x376A0000, 0x376B0000, 0x376C0000, 0x376D0000, 0x376E0000, 0x376F0000, 
				0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000, 0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377A0000, 0x377B0000, 0x377C0000, 0x377D0000, 0x377E0000, 0x377F0000, 
				0x37800000, 0x37808000, 0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000, 0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000, 0x37870000, 0x37878000, 
				0x37880000, 0x37888000, 0x37890000, 0x37898000, 0x378A0000, 0x378A8000, 0x378B0000, 0x378B8000, 0x378C0000, 0x378C8000, 0x378D0000, 0x378D8000, 0x378E0000, 0x378E8000, 0x378F0000, 0x378F8000, 
				0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000, 0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000, 0x37960000, 0x37968000, 0x37970000, 0x37978000, 
				0x37980000, 0x37988000, 0x37990000, 0x37998000, 0x379A0000, 0x379A8000, 0x379B0000, 0x379B8000, 0x379C0000, 0x379C8000, 0x379D0000, 0x379D8000, 0x379E0000, 0x379E8000, 0x379F0000, 0x379F8000, 
				0x37A00000, 0x37A08000, 0x37A10000, 0x37A18000, 0x37A20000, 0x37A28000, 0x37A30000, 0x37A38000, 0x37A40000, 0x37A48000, 0x37A50000, 0x37A58000, 0x37A60000, 0x37A68000, 0x37A70000, 0x37A78000, 
				0x37A80000, 0x37A88000, 0x37A90000, 0x37A98000, 0x37AA0000, 0x37AA8000, 0x37AB0000, 0x37AB8000, 0x37AC0000, 0x37AC8000, 0x37AD0000, 0x37AD8000, 0x37AE0000, 0x37AE8000, 0x37AF0000, 0x37AF8000, 
				0x37B00000, 0x37B08000, 0x37B10000, 0x37B18000, 0x37B20000, 0x37B28000, 0x37B30000, 0x37B38000, 0x37B40000, 0x37B48000, 0x37B50000, 0x37B58000, 0x37B60000, 0x37B68000, 0x37B70000, 0x37B78000, 
				0x37B80000, 0x37B88000, 0x37B90000, 0x37B98000, 0x37BA0000, 0x37BA8000, 0x37BB0000, 0x37BB8000, 0x37BC0000, 0x37BC8000, 0x37BD0000, 0x37BD8000, 0x37BE0000, 0x37BE8000, 0x37BF0000, 0x37BF8000, 
				0x37C00000, 0x37C08000, 0x37C10000, 0x37C18000, 0x37C20000, 0x37C28000, 0x37C30000, 0x37C38000, 0x37C40000, 0x37C48000, 0x37C50000, 0x37C58000, 0x37C60000, 0x37C68000, 0x37C70000, 0x37C78000, 
				0x37C80000, 0x37C88000, 0x37C90000, 0x37C98000, 0x37CA0000, 0x37CA8000, 0x37CB0000, 0x37CB8000, 0x37CC0000, 0x37CC8000, 0x37CD0000, 0x37CD8000, 0x37CE0000, 0x37CE8000, 0x37CF0000, 0x37CF8000, 
				0x37D00000, 0x37D08000, 0x37D10000, 0x37D18000, 0x37D20000, 0x37D28000, 0x37D30000, 0x37D38000, 0x37D40000, 0x37D48000, 0x37D50000, 0x37D58000, 0x37D60000, 0x37D68000, 0x37D70000, 0x37D78000, 
				0x37D80000, 0x37D88000, 0x37D90000, 0x37D98000, 0x37DA0000, 0x37DA8000, 0x37DB0000, 0x37DB8000, 0x37DC0000, 0x37DC8000, 0x37DD0000, 0x37DD8000, 0x37DE0000, 0x37DE8000, 0x37DF0000, 0x37DF8000, 
				0x37E00000, 0x37E08000, 0x37E10000, 0x37E18000, 0x37E20000, 0x37E28000, 0x37E30000, 0x37E38000, 0x37E40000, 0x37E48000, 0x37E50000, 0x37E58000, 0x37E60000, 0x37E68000, 0x37E70000, 0x37E78000, 
				0x37E80000, 0x37E88000, 0x37E90000, 0x37E98000, 0x37EA0000, 0x37EA8000, 0x37EB0000, 0x37EB8000, 0x37EC0000, 0x37EC8000, 0x37ED0000, 0x37ED8000, 0x37EE0000, 0x37EE8000, 0x37EF0000, 0x37EF8000, 
				0x37F00000, 0x37F08000, 0x37F10000, 0x37F18000, 0x37F20000, 0x37F28000, 0x37F30000, 0x37F38000, 0x37F40000, 0x37F48000, 0x37F50000, 0x37F58000, 0x37F60000, 0x37F68000, 0x37F70000, 0x37F78000, 
				0x37F80000, 0x37F88000, 0x37F90000, 0x37F98000, 0x37FA0000, 0x37FA8000, 0x37FB0000, 0x37FB8000, 0x37FC0000, 0x37FC8000, 0x37FD0000, 0x37FD8000, 0x37FE0000, 0x37FE8000, 0x37FF0000, 0x37FF8000, 
				0x38000000, 0x38004000, 0x38008000, 0x3800C000, 0x38010000, 0x38014000, 0x38018000, 0x3801C000, 0x38020000, 0x38024000, 0x38028000, 0x3802C000, 0x38030000, 0x38034000, 0x38038000, 0x3803C000, 
				0x38040000, 0x38044000, 0x38048000, 0x3804C000, 0x38050000, 0x38054000, 0x38058000, 0x3805C000, 0x38060000, 0x38064000, 0x38068000, 0x3806C000, 0x38070000, 0x38074000, 0x38078000, 0x3807C000, 
				0x38080000, 0x38084000, 0x38088000, 0x3808C000, 0x38090000, 0x38094000, 0x38098000, 0x3809C000, 0x380A0000, 0x380A4000, 0x380A8000, 0x380AC000, 0x380B0000, 0x380B4000, 0x380B8000, 0x380BC000, 
				0x380C0000, 0x380C4000, 0x380C8000, 0x380CC000, 0x380D0000, 0x380D4000, 0x380D8000, 0x380DC000, 0x380E0000, 0x380E4000, 0x380E8000, 0x380EC000, 0x380F0000, 0x380F4000, 0x380F8000, 0x380FC000, 
				0x38100000, 0x38104000, 0x38108000, 0x3810C000, 0x38110000, 0x38114000, 0x38118000, 0x3811C000, 0x38120000, 0x38124000, 0x38128000, 0x3812C000, 0x38130000, 0x38134000, 0x38138000, 0x3813C000, 
				0x38140000, 0x38144000, 0x38148000, 0x3814C000, 0x38150000, 0x38154000, 0x38158000, 0x3815C000, 0x38160000, 0x38164000, 0x38168000, 0x3816C000, 0x38170000, 0x38174000, 0x38178000, 0x3817C000, 
				0x38180000, 0x38184000, 0x38188000, 0x3818C000, 0x38190000, 0x38194000, 0x38198000, 0x3819C000, 0x381A0000, 0x381A4000, 0x381A8000, 0x381AC000, 0x381B0000, 0x381B4000, 0x381B8000, 0x381BC000, 
				0x381C0000, 0x381C4000, 0x381C8000, 0x381CC000, 0x381D0000, 0x381D4000, 0x381D8000, 0x381DC000, 0x381E0000, 0x381E4000, 0x381E8000, 0x381EC000, 0x381F0000, 0x381F4000, 0x381F8000, 0x381FC000, 
				0x38200000, 0x38204000, 0x38208000, 0x3820C000, 0x38210000, 0x38214000, 0x38218000, 0x3821C000, 0x38220000, 0x38224000, 0x38228000, 0x3822C000, 0x38230000, 0x38234000, 0x38238000, 0x3823C000, 
				0x38240000, 0x38244000, 0x38248000, 0x3824C000, 0x38250000, 0x38254000, 0x38258000, 0x3825C000, 0x38260000, 0x38264000, 0x38268000, 0x3826C000, 0x38270000, 0x38274000, 0x38278000, 0x3827C000, 
				0x38280000, 0x38284000, 0x38288000, 0x3828C000, 0x38290000, 0x38294000, 0x38298000, 0x3829C000, 0x382A0000, 0x382A4000, 0x382A8000, 0x382AC000, 0x382B0000, 0x382B4000, 0x382B8000, 0x382BC000, 
				0x382C0000, 0x382C4000, 0x382C8000, 0x382CC000, 0x382D0000, 0x382D4000, 0x382D8000, 0x382DC000, 0x382E0000, 0x382E4000, 0x382E8000, 0x382EC000, 0x382F0000, 0x382F4000, 0x382F8000, 0x382FC000, 
				0x38300000, 0x38304000, 0x38308000, 0x3830C000, 0x38310000, 0x38314000, 0x38318000, 0x3831C000, 0x38320000, 0x38324000, 0x38328000, 0x3832C000, 0x38330000, 0x38334000, 0x38338000, 0x3833C000, 
				0x38340000, 0x38344000, 0x38348000, 0x3834C000, 0x38350000, 0x38354000, 0x38358000, 0x3835C000, 0x38360000, 0x38364000, 0x38368000, 0x3836C000, 0x38370000, 0x38374000, 0x38378000, 0x3837C000, 
				0x38380000, 0x38384000, 0x38388000, 0x3838C000, 0x38390000, 0x38394000, 0x38398000, 0x3839C000, 0x383A0000, 0x383A4000, 0x383A8000, 0x383AC000, 0x383B0000, 0x383B4000, 0x383B8000, 0x383BC000, 
				0x383C0000, 0x383C4000, 0x383C8000, 0x383CC000, 0x383D0000, 0x383D4000, 0x383D8000, 0x383DC000, 0x383E0000, 0x383E4000, 0x383E8000, 0x383EC000, 0x383F0000, 0x383F4000, 0x383F8000, 0x383FC000, 
				0x38400000, 0x38404000, 0x38408000, 0x3840C000, 0x38410000, 0x38414000, 0x38418000, 0x3841C000, 0x38420000, 0x38424000, 0x38428000, 0x3842C000, 0x38430000, 0x38434000, 0x38438000, 0x3843C000, 
				0x38440000, 0x38444000, 0x38448000, 0x3844C000, 0x38450000, 0x38454000, 0x38458000, 0x3845C000, 0x38460000, 0x38464000, 0x38468000, 0x3846C000, 0x38470000, 0x38474000, 0x38478000, 0x3847C000, 
				0x38480000, 0x38484000, 0x38488000, 0x3848C000, 0x38490000, 0x38494000, 0x38498000, 0x3849C000, 0x384A0000, 0x384A4000, 0x384A8000, 0x384AC000, 0x384B0000, 0x384B4000, 0x384B8000, 0x384BC000, 
				0x384C0000, 0x384C4000, 0x384C8000, 0x384CC000, 0x384D0000, 0x384D4000, 0x384D8000, 0x384DC000, 0x384E0000, 0x384E4000, 0x384E8000, 0x384EC000, 0x384F0000, 0x384F4000, 0x384F8000, 0x384FC000, 
				0x38500000, 0x38504000, 0x38508000, 0x3850C000, 0x38510000, 0x38514000, 0x38518000, 0x3851C000, 0x38520000, 0x38524000, 0x38528000, 0x3852C000, 0x38530000, 0x38534000, 0x38538000, 0x3853C000, 
				0x38540000, 0x38544000, 0x38548000, 0x3854C000, 0x38550000, 0x38554000, 0x38558000, 0x3855C000, 0x38560000, 0x38564000, 0x38568000, 0x3856C000, 0x38570000, 0x38574000, 0x38578000, 0x3857C000, 
				0x38580000, 0x38584000, 0x38588000, 0x3858C000, 0x38590000, 0x38594000, 0x38598000, 0x3859C000, 0x385A0000, 0x385A4000, 0x385A8000, 0x385AC000, 0x385B0000, 0x385B4000, 0x385B8000, 0x385BC000, 
				0x385C0000, 0x385C4000, 0x385C8000, 0x385CC000, 0x385D0000, 0x385D4000, 0x385D8000, 0x385DC000, 0x385E0000, 0x385E4000, 0x385E8000, 0x385EC000, 0x385F0000, 0x385F4000, 0x385F8000, 0x385FC000, 
				0x38600000, 0x38604000, 0x38608000, 0x3860C000, 0x38610000, 0x38614000, 0x38618000, 0x3861C000, 0x38620000, 0x38624000, 0x38628000, 0x3862C000, 0x38630000, 0x38634000, 0x38638000, 0x3863C000, 
				0x38640000, 0x38644000, 0x38648000, 0x3864C000, 0x38650000, 0x38654000, 0x38658000, 0x3865C000, 0x38660000, 0x38664000, 0x38668000, 0x3866C000, 0x38670000, 0x38674000, 0x38678000, 0x3867C000, 
				0x38680000, 0x38684000, 0x38688000, 0x3868C000, 0x38690000, 0x38694000, 0x38698000, 0x3869C000, 0x386A0000, 0x386A4000, 0x386A8000, 0x386AC000, 0x386B0000, 0x386B4000, 0x386B8000, 0x386BC000, 
				0x386C0000, 0x386C4000, 0x386C8000, 0x386CC000, 0x386D0000, 0x386D4000, 0x386D8000, 0x386DC000, 0x386E0000, 0x386E4000, 0x386E8000, 0x386EC000, 0x386F0000, 0x386F4000, 0x386F8000, 0x386FC000, 
				0x38700000, 0x38704000, 0x38708000, 0x3870C000, 0x38710000, 0x38714000, 0x38718000, 0x3871C000, 0x38720000, 0x38724000, 0x38728000, 0x3872C000, 0x38730000, 0x38734000, 0x38738000, 0x3873C000, 
				0x38740000, 0x38744000, 0x38748000, 0x3874C000, 0x38750000, 0x38754000, 0x38758000, 0x3875C000, 0x38760000, 0x38764000, 0x38768000, 0x3876C000, 0x38770000, 0x38774000, 0x38778000, 0x3877C000, 
				0x38780000, 0x38784000, 0x38788000, 0x3878C000, 0x38790000, 0x38794000, 0x38798000, 0x3879C000, 0x387A0000, 0x387A4000, 0x387A8000, 0x387AC000, 0x387B0000, 0x387B4000, 0x387B8000, 0x387BC000, 
				0x387C0000, 0x387C4000, 0x387C8000, 0x387CC000, 0x387D0000, 0x387D4000, 0x387D8000, 0x387DC000, 0x387E0000, 0x387E4000, 0x387E8000, 0x387EC000, 0x387F0000, 0x387F4000, 0x387F8000, 0x387FC000, 
				0x38000000, 0x38002000, 0x38004000, 0x38006000, 0x38008000, 0x3800A000, 0x3800C000, 0x3800E000, 0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801A000, 0x3801C000, 0x3801E000, 
				0x38020000, 0x38022000, 0x38024000, 0x38026000, 0x38028000, 0x3802A000, 0x3802C000, 0x3802E000, 0x38030000, 0x38032000, 0x38034000, 0x38036000, 0x38038000, 0x3803A000, 0x3803C000, 0x3803E000, 
				0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804A000, 0x3804C000, 0x3804E000, 0x38050000, 0x38052000, 0x38054000, 0x38056000, 0x38058000, 0x3805A000, 0x3805C000, 0x3805E000, 
				0x38060000, 0x38062000, 0x38064000, 0x38066000, 0x38068000, 0x3806A000, 0x3806C000, 0x3806E000, 0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807A000, 0x3807C000, 0x3807E000, 
				0x38080000, 0x38082000, 0x38084000, 0x38086000, 0x38088000, 0x3808A000, 0x3808C000, 0x3808E000, 0x38090000, 0x38092000, 0x38094000, 0x38096000, 0x38098000, 0x3809A000, 0x3809C000, 0x3809E000, 
				0x380A0000, 0x380A2000, 0x380A4000, 0x380A6000, 0x380A8000, 0x380AA000, 0x380AC000, 0x380AE000, 0x380B0000, 0x380B2000, 0x380B4000, 0x380B6000, 0x380B8000, 0x380BA000, 0x380BC000, 0x380BE000, 
				0x380C0000, 0x380C2000, 0x380C4000, 0x380C6000, 0x380C8000, 0x380CA000, 0x380CC000, 0x380CE000, 0x380D0000, 0x380D2000, 0x380D4000, 0x380D6000, 0x380D8000, 0x380DA000, 0x380DC000, 0x380DE000, 
				0x380E0000, 0x380E2000, 0x380E4000, 0x380E6000, 0x380E8000, 0x380EA000, 0x380EC000, 0x380EE000, 0x380F0000, 0x380F2000, 0x380F4000, 0x380F6000, 0x380F8000, 0x380FA000, 0x380FC000, 0x380FE000, 
				0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810A000, 0x3810C000, 0x3810E000, 0x38110000, 0x38112000, 0x38114000, 0x38116000, 0x38118000, 0x3811A000, 0x3811C000, 0x3811E000, 
				0x38120000, 0x38122000, 0x38124000, 0x38126000, 0x38128000, 0x3812A000, 0x3812C000, 0x3812E000, 0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813A000, 0x3813C000, 0x3813E000, 
				0x38140000, 0x38142000, 0x38144000, 0x38146000, 0x38148000, 0x3814A000, 0x3814C000, 0x3814E000, 0x38150000, 0x38152000, 0x38154000, 0x38156000, 0x38158000, 0x3815A000, 0x3815C000, 0x3815E000, 
				0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816A000, 0x3816C000, 0x3816E000, 0x38170000, 0x38172000, 0x38174000, 0x38176000, 0x38178000, 0x3817A000, 0x3817C000, 0x3817E000, 
				0x38180000, 0x38182000, 0x38184000, 0x38186000, 0x38188000, 0x3818A000, 0x3818C000, 0x3818E000, 0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819A000, 0x3819C000, 0x3819E000, 
				0x381A0000, 0x381A2000, 0x381A4000, 0x381A6000, 0x381A8000, 0x381AA000, 0x381AC000, 0x381AE000, 0x381B0000, 0x381B2000, 0x381B4000, 0x381B6000, 0x381B8000, 0x381BA000, 0x381BC000, 0x381BE000, 
				0x381C0000, 0x381C2000, 0x381C4000, 0x381C6000, 0x381C8000, 0x381CA000, 0x381CC000, 0x381CE000, 0x381D0000, 0x381D2000, 0x381D4000, 0x381D6000, 0x381D8000, 0x381DA000, 0x381DC000, 0x381DE000, 
				0x381E0000, 0x381E2000, 0x381E4000, 0x381E6000, 0x381E8000, 0x381EA000, 0x381EC000, 0x381EE000, 0x381F0000, 0x381F2000, 0x381F4000, 0x381F6000, 0x381F8000, 0x381FA000, 0x381FC000, 0x381FE000, 
				0x38200000, 0x38202000, 0x38204000, 0x38206000, 0x38208000, 0x3820A000, 0x3820C000, 0x3820E000, 0x38210000, 0x38212000, 0x38214000, 0x38216000, 0x38218000, 0x3821A000, 0x3821C000, 0x3821E000, 
				0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822A000, 0x3822C000, 0x3822E000, 0x38230000, 0x38232000, 0x38234000, 0x38236000, 0x38238000, 0x3823A000, 0x3823C000, 0x3823E000, 
				0x38240000, 0x38242000, 0x38244000, 0x38246000, 0x38248000, 0x3824A000, 0x3824C000, 0x3824E000, 0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825A000, 0x3825C000, 0x3825E000, 
				0x38260000, 0x38262000, 0x38264000, 0x38266000, 0x38268000, 0x3826A000, 0x3826C000, 0x3826E000, 0x38270000, 0x38272000, 0x38274000, 0x38276000, 0x38278000, 0x3827A000, 0x3827C000, 0x3827E000, 
				0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828A000, 0x3828C000, 0x3828E000, 0x38290000, 0x38292000, 0x38294000, 0x38296000, 0x38298000, 0x3829A000, 0x3829C000, 0x3829E000, 
				0x382A0000, 0x382A2000, 0x382A4000, 0x382A6000, 0x382A8000, 0x382AA000, 0x382AC000, 0x382AE000, 0x382B0000, 0x382B2000, 0x382B4000, 0x382B6000, 0x382B8000, 0x382BA000, 0x382BC000, 0x382BE000, 
				0x382C0000, 0x382C2000, 0x382C4000, 0x382C6000, 0x382C8000, 0x382CA000, 0x382CC000, 0x382CE000, 0x382D0000, 0x382D2000, 0x382D4000, 0x382D6000, 0x382D8000, 0x382DA000, 0x382DC000, 0x382DE000, 
				0x382E0000, 0x382E2000, 0x382E4000, 0x382E6000, 0x382E8000, 0x382EA000, 0x382EC000, 0x382EE000, 0x382F0000, 0x382F2000, 0x382F4000, 0x382F6000, 0x382F8000, 0x382FA000, 0x382FC000, 0x382FE000, 
				0x38300000, 0x38302000, 0x38304000, 0x38306000, 0x38308000, 0x3830A000, 0x3830C000, 0x3830E000, 0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831A000, 0x3831C000, 0x3831E000, 
				0x38320000, 0x38322000, 0x38324000, 0x38326000, 0x38328000, 0x3832A000, 0x3832C000, 0x3832E000, 0x38330000, 0x38332000, 0x38334000, 0x38336000, 0x38338000, 0x3833A000, 0x3833C000, 0x3833E000, 
				0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834A000, 0x3834C000, 0x3834E000, 0x38350000, 0x38352000, 0x38354000, 0x38356000, 0x38358000, 0x3835A000, 0x3835C000, 0x3835E000, 
				0x38360000, 0x38362000, 0x38364000, 0x38366000, 0x38368000, 0x3836A000, 0x3836C000, 0x3836E000, 0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837A000, 0x3837C000, 0x3837E000, 
				0x38380000, 0x38382000, 0x38384000, 0x38386000, 0x38388000, 0x3838A000, 0x3838C000, 0x3838E000, 0x38390000, 0x38392000, 0x38394000, 0x38396000, 0x38398000, 0x3839A000, 0x3839C000, 0x3839E000, 
				0x383A0000, 0x383A2000, 0x383A4000, 0x383A6000, 0x383A8000, 0x383AA000, 0x383AC000, 0x383AE000, 0x383B0000, 0x383B2000, 0x383B4000, 0x383B6000, 0x383B8000, 0x383BA000, 0x383BC000, 0x383BE000, 
				0x383C0000, 0x383C2000, 0x383C4000, 0x383C6000, 0x383C8000, 0x383CA000, 0x383CC000, 0x383CE000, 0x383D0000, 0x383D2000, 0x383D4000, 0x383D6000, 0x383D8000, 0x383DA000, 0x383DC000, 0x383DE000, 
				0x383E0000, 0x383E2000, 0x383E4000, 0x383E6000, 0x383E8000, 0x383EA000, 0x383EC000, 0x383EE000, 0x383F0000, 0x383F2000, 0x383F4000, 0x383F6000, 0x383F8000, 0x383FA000, 0x383FC000, 0x383FE000, 
				0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840A000, 0x3840C000, 0x3840E000, 0x38410000, 0x38412000, 0x38414000, 0x38416000, 0x38418000, 0x3841A000, 0x3841C000, 0x3841E000, 
				0x38420000, 0x38422000, 0x38424000, 0x38426000, 0x38428000, 0x3842A000, 0x3842C000, 0x3842E000, 0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843A000, 0x3843C000, 0x3843E000, 
				0x38440000, 0x38442000, 0x38444000, 0x38446000, 0x38448000, 0x3844A000, 0x3844C000, 0x3844E000, 0x38450000, 0x38452000, 0x38454000, 0x38456000, 0x38458000, 0x3845A000, 0x3845C000, 0x3845E000, 
				0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846A000, 0x3846C000, 0x3846E000, 0x38470000, 0x38472000, 0x38474000, 0x38476000, 0x38478000, 0x3847A000, 0x3847C000, 0x3847E000, 
				0x38480000, 0x38482000, 0x38484000, 0x38486000, 0x38488000, 0x3848A000, 0x3848C000, 0x3848E000, 0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849A000, 0x3849C000, 0x3849E000, 
				0x384A0000, 0x384A2000, 0x384A4000, 0x384A6000, 0x384A8000, 0x384AA000, 0x384AC000, 0x384AE000, 0x384B0000, 0x384B2000, 0x384B4000, 0x384B6000, 0x384B8000, 0x384BA000, 0x384BC000, 0x384BE000, 
				0x384C0000, 0x384C2000, 0x384C4000, 0x384C6000, 0x384C8000, 0x384CA000, 0x384CC000, 0x384CE000, 0x384D0000, 0x384D2000, 0x384D4000, 0x384D6000, 0x384D8000, 0x384DA000, 0x384DC000, 0x384DE000, 
				0x384E0000, 0x384E2000, 0x384E4000, 0x384E6000, 0x384E8000, 0x384EA000, 0x384EC000, 0x384EE000, 0x384F0000, 0x384F2000, 0x384F4000, 0x384F6000, 0x384F8000, 0x384FA000, 0x384FC000, 0x384FE000, 
				0x38500000, 0x38502000, 0x38504000, 0x38506000, 0x38508000, 0x3850A000, 0x3850C000, 0x3850E000, 0x38510000, 0x38512000, 0x38514000, 0x38516000, 0x38518000, 0x3851A000, 0x3851C000, 0x3851E000, 
				0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852A000, 0x3852C000, 0x3852E000, 0x38530000, 0x38532000, 0x38534000, 0x38536000, 0x38538000, 0x3853A000, 0x3853C000, 0x3853E000, 
				0x38540000, 0x38542000, 0x38544000, 0x38546000, 0x38548000, 0x3854A000, 0x3854C000, 0x3854E000, 0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855A000, 0x3855C000, 0x3855E000, 
				0x38560000, 0x38562000, 0x38564000, 0x38566000, 0x38568000, 0x3856A000, 0x3856C000, 0x3856E000, 0x38570000, 0x38572000, 0x38574000, 0x38576000, 0x38578000, 0x3857A000, 0x3857C000, 0x3857E000, 
				0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858A000, 0x3858C000, 0x3858E000, 0x38590000, 0x38592000, 0x38594000, 0x38596000, 0x38598000, 0x3859A000, 0x3859C000, 0x3859E000, 
				0x385A0000, 0x385A2000, 0x385A4000, 0x385A6000, 0x385A8000, 0x385AA000, 0x385AC000, 0x385AE000, 0x385B0000, 0x385B2000, 0x385B4000, 0x385B6000, 0x385B8000, 0x385BA000, 0x385BC000, 0x385BE000, 
				0x385C0000, 0x385C2000, 0x385C4000, 0x385C6000, 0x385C8000, 0x385CA000, 0x385CC000, 0x385CE000, 0x385D0000, 0x385D2000, 0x385D4000, 0x385D6000, 0x385D8000, 0x385DA000, 0x385DC000, 0x385DE000, 
				0x385E0000, 0x385E2000, 0x385E4000, 0x385E6000, 0x385E8000, 0x385EA000, 0x385EC000, 0x385EE000, 0x385F0000, 0x385F2000, 0x385F4000, 0x385F6000, 0x385F8000, 0x385FA000, 0x385FC000, 0x385FE000, 
				0x38600000, 0x38602000, 0x38604000, 0x38606000, 0x38608000, 0x3860A000, 0x3860C000, 0x3860E000, 0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861A000, 0x3861C000, 0x3861E000, 
				0x38620000, 0x38622000, 0x38624000, 0x38626000, 0x38628000, 0x3862A000, 0x3862C000, 0x3862E000, 0x38630000, 0x38632000, 0x38634000, 0x38636000, 0x38638000, 0x3863A000, 0x3863C000, 0x3863E000, 
				0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864A000, 0x3864C000, 0x3864E000, 0x38650000, 0x38652000, 0x38654000, 0x38656000, 0x38658000, 0x3865A000, 0x3865C000, 0x3865E000, 
				0x38660000, 0x38662000, 0x38664000, 0x38666000, 0x38668000, 0x3866A000, 0x3866C000, 0x3866E000, 0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867A000, 0x3867C000, 0x3867E000, 
				0x38680000, 0x38682000, 0x38684000, 0x38686000, 0x38688000, 0x3868A000, 0x3868C000, 0x3868E000, 0x38690000, 0x38692000, 0x38694000, 0x38696000, 0x38698000, 0x3869A000, 0x3869C000, 0x3869E000, 
				0x386A0000, 0x386A2000, 0x386A4000, 0x386A6000, 0x386A8000, 0x386AA000, 0x386AC000, 0x386AE000, 0x386B0000, 0x386B2000, 0x386B4000, 0x386B6000, 0x386B8000, 0x386BA000, 0x386BC000, 0x386BE000, 
				0x386C0000, 0x386C2000, 0x386C4000, 0x386C6000, 0x386C8000, 0x386CA000, 0x386CC000, 0x386CE000, 0x386D0000, 0x386D2000, 0x386D4000, 0x386D6000, 0x386D8000, 0x386DA000, 0x386DC000, 0x386DE000, 
				0x386E0000, 0x386E2000, 0x386E4000, 0x386E6000, 0x386E8000, 0x386EA000, 0x386EC000, 0x386EE000, 0x386F0000, 0x386F2000, 0x386F4000, 0x386F6000, 0x386F8000, 0x386FA000, 0x386FC000, 0x386FE000, 
				0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870A000, 0x3870C000, 0x3870E000, 0x38710000, 0x38712000, 0x38714000, 0x38716000, 0x38718000, 0x3871A000, 0x3871C000, 0x3871E000, 
				0x38720000, 0x38722000, 0x38724000, 0x38726000, 0x38728000, 0x3872A000, 0x3872C000, 0x3872E000, 0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873A000, 0x3873C000, 0x3873E000, 
				0x38740000, 0x38742000, 0x38744000, 0x38746000, 0x38748000, 0x3874A000, 0x3874C000, 0x3874E000, 0x38750000, 0x38752000, 0x38754000, 0x38756000, 0x38758000, 0x3875A000, 0x3875C000, 0x3875E000, 
				0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876A000, 0x3876C000, 0x3876E000, 0x38770000, 0x38772000, 0x38774000, 0x38776000, 0x38778000, 0x3877A000, 0x3877C000, 0x3877E000, 
				0x38780000, 0x38782000, 0x38784000, 0x38786000, 0x38788000, 0x3878A000, 0x3878C000, 0x3878E000, 0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879A000, 0x3879C000, 0x3879E000, 
				0x387A0000, 0x387A2000, 0x387A4000, 0x387A6000, 0x387A8000, 0x387AA000, 0x387AC000, 0x387AE000, 0x387B0000, 0x387B2000, 0x387B4000, 0x387B6000, 0x387B8000, 0x387BA000, 0x387BC000, 0x387BE000, 
				0x387C0000, 0x387C2000, 0x387C4000, 0x387C6000, 0x387C8000, 0x387CA000, 0x387CC000, 0x387CE000, 0x387D0000, 0x387D2000, 0x387D4000, 0x387D6000, 0x387D8000, 0x387DA000, 0x387DC000, 0x387DE000, 
				0x387E0000, 0x387E2000, 0x387E4000, 0x387E6000, 0x387E8000, 0x387EA000, 0x387EC000, 0x387EE000, 0x387F0000, 0x387F2000, 0x387F4000, 0x387F6000, 0x387F8000, 0x387FA000, 0x387FC000, 0x387FE000 };
			static const uint32 exponent_table[64] = { 
				0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000, 0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000, 0x06000000, 0x06800000, 0x07000000, 0x07800000, 
				0x08000000, 0x08800000, 0x09000000, 0x09800000, 0x0A000000, 0x0A800000, 0x0B000000, 0x0B800000, 0x0C000000, 0x0C800000, 0x0D000000, 0x0D800000, 0x0E000000, 0x0E800000, 0x0F000000, 0x47800000, 
				0x80000000, 0x80800000, 0x81000000, 0x81800000, 0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000, 0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000, 
				0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8A000000, 0x8A800000, 0x8B000000, 0x8B800000, 0x8C000000, 0x8C800000, 0x8D000000, 0x8D800000, 0x8E000000, 0x8E800000, 0x8F000000, 0xC7800000 };
			static const unsigned short offset_table[64] = { 
				   0, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 
				   0, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024 };
			uint32 bits = mantissa_table[offset_table[value>>10]+(value&0x3FF)] + exponent_table[value>>10];
//			return *reinterpret_cast<float*>(&bits);			//violating strict aliasing!
			float out;
			std::memcpy(&out, &bits, sizeof(float));
			return out;
		}

		/// Convert half-precision to IEEE double-precision.
		/// \param value binary representation of half-precision value
		/// \return double-precision value
		inline double half2float_impl(uint16 value, double, true_type)
		{
			typedef bits<float>::type uint32;
			typedef bits<double>::type uint64;
			uint32 hi = static_cast<uint32>(value&0x8000) << 16;
			int abs = value & 0x7FFF;
			if(abs)
			{
				hi |= 0x3F000000 << static_cast<unsigned>(abs>=0x7C00);
				for(; abs<0x400; abs<<=1,hi-=0x100000) ;
				hi += static_cast<uint32>(abs) << 10;
			}
			uint64 bits = static_cast<uint64>(hi) << 32;
//			return *reinterpret_cast<double*>(&bits);			//violating strict aliasing!
			double out;
			std::memcpy(&out, &bits, sizeof(double));
			return out;
		}

		/// Convert half-precision to non-IEEE floating point.
		/// \tparam T type to convert to (builtin integer type)
		/// \param value binary representation of half-precision value
		/// \return floating point value
		template<typename T> T half2float_impl(uint16 value, T, ...)
		{
			T out;
			int abs = value & 0x7FFF;
			if(abs > 0x7C00)
				out = std::numeric_limits<T>::has_quiet_NaN ? std::numeric_limits<T>::quiet_NaN() : T();
			else if(abs == 0x7C00)
				out = std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : std::numeric_limits<T>::max();
			else if(abs > 0x3FF)
				out = std::ldexp(static_cast<T>((abs&0x3FF)|0x400), (abs>>10)-25);
			else
				out = std::ldexp(static_cast<T>(abs), -24);
			return (value&0x8000) ? -out : out;
		}

		/// Convert half-precision to floating point.
		/// \tparam T type to convert to (builtin integer type)
		/// \param value binary representation of half-precision value
		/// \return floating point value
		template<typename T> T half2float(uint16 value)
		{
			return half2float_impl(value, T(), bool_type<std::numeric_limits<T>::is_iec559&&sizeof(typename bits<T>::type)==sizeof(T)>());
		}

		/// Convert half-precision floating point to integer.
		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
		/// \tparam E `true` for round to even, `false` for round away from zero
		/// \tparam T type to convert to (buitlin integer type with at least 16 bits precision, excluding any implicit sign bits)
		/// \param value binary representation of half-precision value
		/// \return integral value
		template<std::float_round_style R,bool E,typename T> T half2int_impl(uint16 value)
		{
		#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
			static_assert(std::is_integral<T>::value, "half to int conversion only supports builtin integer types");
		#endif
			unsigned int e = value & 0x7FFF;
			if(e >= 0x7C00)
				return (value&0x8000) ? std::numeric_limits<T>::min() : std::numeric_limits<T>::max();
			if(e < 0x3800)
			{
				if(R == std::round_toward_infinity)
					return T(~(value>>15)&(e!=0));
				else if(R == std::round_toward_neg_infinity)
					return -T(value>0x8000);
				return T();
			}
			unsigned int m = (value&0x3FF) | 0x400;
			e >>= 10;
			if(e < 25)
			{
				if(R == std::round_to_nearest)
					m += (1<<(24-e)) - (~(m>>(25-e))&E);
				else if(R == std::round_toward_infinity)
					m += ((value>>15)-1) & ((1<<(25-e))-1U);
				else if(R == std::round_toward_neg_infinity)
					m += -(value>>15) & ((1<<(25-e))-1U);
				m >>= 25 - e;
			}
			else
				m <<= e - 25;
			return (value&0x8000) ? -static_cast<T>(m) : static_cast<T>(m);
		}

		/// Convert half-precision floating point to integer.
		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
		/// \tparam T type to convert to (buitlin integer type with at least 16 bits precision, excluding any implicit sign bits)
		/// \param value binary representation of half-precision value
		/// \return integral value
		template<std::float_round_style R,typename T> T half2int(uint16 value) { return half2int_impl<R,HALF_ROUND_TIES_TO_EVEN,T>(value); }

		/// Convert half-precision floating point to integer using round-to-nearest-away-from-zero.
		/// \tparam T type to convert to (buitlin integer type with at least 16 bits precision, excluding any implicit sign bits)
		/// \param value binary representation of half-precision value
		/// \return integral value
		template<typename T> T half2int_up(uint16 value) { return half2int_impl<std::round_to_nearest,0,T>(value); }

		/// Round half-precision number to nearest integer value.
		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
		/// \tparam E `true` for round to even, `false` for round away from zero
		/// \param value binary representation of half-precision value
		/// \return half-precision bits for nearest integral value
		template<std::float_round_style R,bool E> uint16 round_half_impl(uint16 value)
		{
			unsigned int e = value & 0x7FFF;
			uint16 result = value;
			if(e < 0x3C00)
			{
				result &= 0x8000;
				if(R == std::round_to_nearest)
					result |= 0x3C00U & -(e>=(0x3800+E));
				else if(R == std::round_toward_infinity)
					result |= 0x3C00U & -(~(value>>15)&(e!=0));
				else if(R == std::round_toward_neg_infinity)
					result |= 0x3C00U & -(value>0x8000);
			}
			else if(e < 0x6400)
			{
				e = 25 - (e>>10);
				unsigned int mask = (1<<e) - 1;
				if(R == std::round_to_nearest)
					result += (1<<(e-1)) - (~(result>>e)&E);
				else if(R == std::round_toward_infinity)
					result += mask & ((value>>15)-1);
				else if(R == std::round_toward_neg_infinity)
					result += mask & -(value>>15);
				result &= ~mask;
			}
			return result;
		}

		/// Round half-precision number to nearest integer value.
		/// \tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding
		/// \param value binary representation of half-precision value
		/// \return half-precision bits for nearest integral value
		template<std::float_round_style R> uint16 round_half(uint16 value) { return round_half_impl<R,HALF_ROUND_TIES_TO_EVEN>(value); }

		/// Round half-precision number to nearest integer value using round-to-nearest-away-from-zero.
		/// \param value binary representation of half-precision value
		/// \return half-precision bits for nearest integral value
		inline uint16 round_half_up(uint16 value) { return round_half_impl<std::round_to_nearest,0>(value); }
		/// \}

		struct functions;
		template<typename> struct unary_specialized;
		template<typename,typename> struct binary_specialized;
		template<typename,typename,std::float_round_style> struct half_caster;
	}

	/// Half-precision floating point type.
	/// This class implements an IEEE-conformant half-precision floating point type with the usual arithmetic operators and 
	/// conversions. It is implicitly convertible to single-precision floating point, which makes artihmetic expressions and 
	/// functions with mixed-type operands to be of the most precise operand type. Additionally all arithmetic operations 
	/// (and many mathematical functions) are carried out in single-precision internally. All conversions from single- to 
	/// half-precision are done using the library's default rounding mode, but temporary results inside chained arithmetic 
	/// expressions are kept in single-precision as long as possible (while of course still maintaining a strong half-precision type).
	///
	/// According to the C++98/03 definition, the half type is not a POD type. But according to C++11's less strict and 
	/// extended definitions it is both a standard layout type and a trivially copyable type (even if not a POD type), which 
	/// means it can be standard-conformantly copied using raw binary copies. But in this context some more words about the 
	/// actual size of the type. Although the half is representing an IEEE 16-bit type, it does not neccessarily have to be of 
	/// exactly 16-bits size. But on any reasonable implementation the actual binary representation of this type will most 
	/// probably not ivolve any additional "magic" or padding beyond the simple binary representation of the underlying 16-bit 
	/// IEEE number, even if not strictly guaranteed by the standard. But even then it only has an actual size of 16 bits if 
	/// your C++ implementation supports an unsigned integer type of exactly 16 bits width. But this should be the case on 
	/// nearly any reasonable platform.
	///
	/// So if your C++ implementation is not totally exotic or imposes special alignment requirements, it is a reasonable 
	/// assumption that the data of a half is just comprised of the 2 bytes of the underlying IEEE representation.
	class half
	{
		friend struct detail::functions;
		friend struct detail::unary_specialized<half>;
		friend struct detail::binary_specialized<half,half>;
		template<typename,typename,std::float_round_style> friend struct detail::half_caster;
		friend class std::numeric_limits<half>;
	#if HALF_ENABLE_CPP11_HASH
		friend struct std::hash<half>;
	#endif
	#if HALF_ENABLE_CPP11_USER_LITERALS
		friend half literal::operator""_h(long double);
	#endif

	public:
		/// Default constructor.
		/// This initializes the half to 0. Although this does not match the builtin types' default-initialization semantics 
		/// and may be less efficient than no initialization, it is needed to provide proper value-initialization semantics.
		HALF_CONSTEXPR half() HALF_NOEXCEPT : data_() {}

		/// Copy constructor.
		/// \tparam T type of concrete half expression
		/// \param rhs half expression to copy from
		half(detail::expr rhs) : data_(detail::float2half<round_style>(static_cast<float>(rhs))) {}

		/// Conversion constructor.
		/// \param rhs float to convert
		explicit half(float rhs) : data_(detail::float2half<round_style>(rhs)) {}
	
		/// Conversion to single-precision.
		/// \return single precision value representing expression value
		operator float() const { return detail::half2float<float>(data_); }

		/// Assignment operator.
		/// \tparam T type of concrete half expression
		/// \param rhs half expression to copy from
		/// \return reference to this half
		half& operator=(detail::expr rhs) { return *this = static_cast<float>(rhs); }

		/// Arithmetic assignment.
		/// \tparam T type of concrete half expression
		/// \param rhs half expression to add
		/// \return reference to this half
		template<typename T> typename detail::enable<half&,T>::type operator+=(T rhs) { return *this += static_cast<float>(rhs); }

		/// Arithmetic assignment.
		/// \tparam T type of concrete half expression
		/// \param rhs half expression to subtract
		/// \return reference to this half
		template<typename T> typename detail::enable<half&,T>::type operator-=(T rhs) { return *this -= static_cast<float>(rhs); }

		/// Arithmetic assignment.
		/// \tparam T type of concrete half expression
		/// \param rhs half expression to multiply with
		/// \return reference to this half
		template<typename T> typename detail::enable<half&,T>::type operator*=(T rhs) { return *this *= static_cast<float>(rhs); }

		/// Arithmetic assignment.
		/// \tparam T type of concrete half expression
		/// \param rhs half expression to divide by
		/// \return reference to this half
		template<typename T> typename detail::enable<half&,T>::type operator/=(T rhs) { return *this /= static_cast<float>(rhs); }

		/// Assignment operator.
		/// \param rhs single-precision value to copy from
		/// \return reference to this half
		half& operator=(float rhs) { data_ = detail::float2half<round_style>(rhs); return *this; }

		/// Arithmetic assignment.
		/// \param rhs single-precision value to add
		/// \return reference to this half
		half& operator+=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float<float>(data_)+rhs); return *this; }

		/// Arithmetic assignment.
		/// \param rhs single-precision value to subtract
		/// \return reference to this half
		half& operator-=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float<float>(data_)-rhs); return *this; }

		/// Arithmetic assignment.
		/// \param rhs single-precision value to multiply with
		/// \return reference to this half
		half& operator*=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float<float>(data_)*rhs); return *this; }

		/// Arithmetic assignment.
		/// \param rhs single-precision value to divide by
		/// \return reference to this half
		half& operator/=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float<float>(data_)/rhs); return *this; }

		/// Prefix increment.
		/// \return incremented half value
		half& operator++() { return *this += 1.0f; }

		/// Prefix decrement.
		/// \return decremented half value
		half& operator--() { return *this -= 1.0f; }

		/// Postfix increment.
		/// \return non-incremented half value
		half operator++(int) { half out(*this); ++*this; return out; }

		/// Postfix decrement.
		/// \return non-decremented half value
		half operator--(int) { half out(*this); --*this; return out; }
	
	private:
		/// Rounding mode to use
		static const std::float_round_style round_style = (std::float_round_style)(HALF_ROUND_STYLE);

		/// Constructor.
		/// \param bits binary representation to set half to
		HALF_CONSTEXPR half(detail::binary_t, detail::uint16 bits) HALF_NOEXCEPT : data_(bits) {}

		/// Internal binary representation
		detail::uint16 data_;
	};

#if HALF_ENABLE_CPP11_USER_LITERALS
	namespace literal
	{
		/// Half literal.
		/// While this returns an actual half-precision value, half literals can unfortunately not be constant expressions due 
		/// to rather involved conversions.
		/// \param value literal value
		/// \return half with given value (if representable)
		inline half operator""_h(long double value) { return half(detail::binary, detail::float2half<half::round_style>(value)); }
	}
#endif

	namespace detail
	{
		/// Wrapper implementing unspecialized half-precision functions.
		struct functions
		{
			/// Addition implementation.
			/// \param x first operand
			/// \param y second operand
			/// \return Half-precision sum stored in single-precision
			static expr plus(float x, float y) { return expr(x+y); }

			/// Subtraction implementation.
			/// \param x first operand
			/// \param y second operand
			/// \return Half-precision difference stored in single-precision
			static expr minus(float x, float y) { return expr(x-y); }

			/// Multiplication implementation.
			/// \param x first operand
			/// \param y second operand
			/// \return Half-precision product stored in single-precision
			static expr multiplies(float x, float y) { return expr(x*y); }

			/// Division implementation.
			/// \param x first operand
			/// \param y second operand
			/// \return Half-precision quotient stored in single-precision
			static expr divides(float x, float y) { return expr(x/y); }

			/// Output implementation.
			/// \param out stream to write to
			/// \param arg value to write
			/// \return reference to stream
			template<typename charT,typename traits> static std::basic_ostream<charT,traits>& write(std::basic_ostream<charT,traits> &out, float arg) { return out << arg; }

			/// Input implementation.
			/// \param in stream to read from
			/// \param arg half to read into
			/// \return reference to stream
			template<typename charT,typename traits> static std::basic_istream<charT,traits>& read(std::basic_istream<charT,traits> &in, half &arg)
			{
				float f;
				if(in >> f)
					arg = f;
				return in;
			}

			/// Modulo implementation.
			/// \param x first operand
			/// \param y second operand
			/// \return Half-precision division remainder stored in single-precision
			static expr fmod(float x, float y) { return expr(std::fmod(x, y)); }

			/// Remainder implementation.
			/// \param x first operand
			/// \param y second operand
			/// \return Half-precision division remainder stored in single-precision
			static expr remainder(float x, float y)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::remainder(x, y));
			#else
				if(builtin_isnan(x) || builtin_isnan(y))
					return expr(std::numeric_limits<float>::quiet_NaN());
				float ax = std::fabs(x), ay = std::fabs(y);
				if(ax >= 65536.0f || ay < std::ldexp(1.0f, -24))
					return expr(std::numeric_limits<float>::quiet_NaN());
				if(ay >= 65536.0f)
					return expr(x);
				if(ax == ay)
					return expr(builtin_signbit(x) ? -0.0f : 0.0f);
				ax = std::fmod(ax, ay+ay);
				float y2 = 0.5f * ay;
				if(ax > y2)
				{
					ax -= ay;
					if(ax >= y2)
						ax -= ay;
				}
				return expr(builtin_signbit(x) ? -ax : ax);
			#endif
			}

			/// Remainder implementation.
			/// \param x first operand
			/// \param y second operand
			/// \param quo address to store quotient bits at
			/// \return Half-precision division remainder stored in single-precision
			static expr remquo(float x, float y, int *quo)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::remquo(x, y, quo));
			#else
				if(builtin_isnan(x) || builtin_isnan(y))
					return expr(std::numeric_limits<float>::quiet_NaN());
				bool sign = builtin_signbit(x), qsign = static_cast<bool>(sign^builtin_signbit(y));
				float ax = std::fabs(x), ay = std::fabs(y);
				if(ax >= 65536.0f || ay < std::ldexp(1.0f, -24))
					return expr(std::numeric_limits<float>::quiet_NaN());
				if(ay >= 65536.0f)
					return expr(x);
				if(ax == ay)
					return *quo = qsign ? -1 : 1, expr(sign ? -0.0f : 0.0f);
				ax = std::fmod(ax, 8.0f*ay);
				int cquo = 0;
				if(ax >= 4.0f * ay)
				{
					ax -= 4.0f * ay;
					cquo += 4;
				}
				if(ax >= 2.0f * ay)
				{
					ax -= 2.0f * ay;
					cquo += 2;
				}
				float y2 = 0.5f * ay;
				if(ax > y2)
				{
					ax -= ay;
					++cquo;
					if(ax >= y2)
					{
						ax -= ay;
						++cquo;
					}
				}
				return *quo = qsign ? -cquo : cquo, expr(sign ? -ax : ax);
			#endif
			}

			/// Positive difference implementation.
			/// \param x first operand
			/// \param y second operand
			/// \return Positive difference stored in single-precision
			static expr fdim(float x, float y)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::fdim(x, y));
			#else
				return expr((x<=y) ? 0.0f : (x-y));
			#endif
			}

			/// Fused multiply-add implementation.
			/// \param x first operand
			/// \param y second operand
			/// \param z third operand
			/// \return \a x * \a y + \a z stored in single-precision
			static expr fma(float x, float y, float z)
			{
			#if HALF_ENABLE_CPP11_CMATH && defined(FP_FAST_FMAF)
				return expr(std::fma(x, y, z));
			#else
				return expr(x*y+z);
			#endif
			}

			/// Get NaN.
			/// \return Half-precision quiet NaN
			static half nanh() { return half(binary, 0x7FFF); }

			/// Exponential implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr exp(float arg) { return expr(std::exp(arg)); }

			/// Exponential implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr expm1(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::expm1(arg));
			#else
				return expr(static_cast<float>(std::exp(static_cast<double>(arg))-1.0));
			#endif
			}

			/// Binary exponential implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr exp2(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::exp2(arg));
			#else
				return expr(static_cast<float>(std::exp(arg*0.69314718055994530941723212145818)));
			#endif
			}

			/// Logarithm implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr log(float arg) { return expr(std::log(arg)); }

			/// Common logarithm implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr log10(float arg) { return expr(std::log10(arg)); }

			/// Logarithm implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr log1p(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::log1p(arg));
			#else
				return expr(static_cast<float>(std::log(1.0+arg)));
			#endif
			}

			/// Binary logarithm implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr log2(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::log2(arg));
			#else
				return expr(static_cast<float>(std::log(static_cast<double>(arg))*1.4426950408889634073599246810019));
			#endif
			}

			/// Square root implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr sqrt(float arg) { return expr(std::sqrt(arg)); }

			/// Cubic root implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr cbrt(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::cbrt(arg));
			#else
				if(builtin_isnan(arg) || builtin_isinf(arg))
					return expr(arg);
				return expr(builtin_signbit(arg) ? -static_cast<float>(std::pow(-static_cast<double>(arg), 1.0/3.0)) : 
					static_cast<float>(std::pow(static_cast<double>(arg), 1.0/3.0)));
			#endif
			}

			/// Hypotenuse implementation.
			/// \param x first argument
			/// \param y second argument
			/// \return function value stored in single-preicision
			static expr hypot(float x, float y)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::hypot(x, y));
			#else
				return expr((builtin_isinf(x) || builtin_isinf(y)) ? std::numeric_limits<float>::infinity() : 
					static_cast<float>(std::sqrt(static_cast<double>(x)*x+static_cast<double>(y)*y)));
			#endif
			}

			/// Power implementation.
			/// \param base value to exponentiate
			/// \param exp power to expontiate to
			/// \return function value stored in single-preicision
			static expr pow(float base, float exp) { return expr(std::pow(base, exp)); }

			/// Sine implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr sin(float arg) { return expr(std::sin(arg)); }

			/// Cosine implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr cos(float arg) { return expr(std::cos(arg)); }

			/// Tan implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr tan(float arg) { return expr(std::tan(arg)); }

			/// Arc sine implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr asin(float arg) { return expr(std::asin(arg)); }

			/// Arc cosine implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr acos(float arg) { return expr(std::acos(arg)); }

			/// Arc tangent implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr atan(float arg) { return expr(std::atan(arg)); }

			/// Arc tangent implementation.
			/// \param x first argument
			/// \param y second argument
			/// \return function value stored in single-preicision
			static expr atan2(float x, float y) { return expr(std::atan2(x, y)); }

			/// Hyperbolic sine implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr sinh(float arg) { return expr(std::sinh(arg)); }

			/// Hyperbolic cosine implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr cosh(float arg) { return expr(std::cosh(arg)); }

			/// Hyperbolic tangent implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr tanh(float arg) { return expr(std::tanh(arg)); }

			/// Hyperbolic area sine implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr asinh(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::asinh(arg));
			#else
				return expr((arg==-std::numeric_limits<float>::infinity()) ? arg : static_cast<float>(std::log(arg+std::sqrt(arg*arg+1.0))));
			#endif
			}

			/// Hyperbolic area cosine implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr acosh(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::acosh(arg));
			#else
				return expr((arg<-1.0f) ? std::numeric_limits<float>::quiet_NaN() : static_cast<float>(std::log(arg+std::sqrt(arg*arg-1.0))));
			#endif
			}

			/// Hyperbolic area tangent implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr atanh(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::atanh(arg));
			#else
				return expr(static_cast<float>(0.5*std::log((1.0+arg)/(1.0-arg))));
			#endif
			}

			/// Error function implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr erf(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::erf(arg));
			#else
				return expr(static_cast<float>(erf(static_cast<double>(arg))));
			#endif
			}

			/// Complementary implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr erfc(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::erfc(arg));
			#else
				return expr(static_cast<float>(1.0-erf(static_cast<double>(arg))));
			#endif
			}

			/// Gamma logarithm implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr lgamma(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::lgamma(arg));
			#else
				if(builtin_isinf(arg))
					return expr(std::numeric_limits<float>::infinity());
				if(arg < 0.0f)
				{
					float i, f = std::modf(-arg, &i);
					if(f == 0.0f)
						return expr(std::numeric_limits<float>::infinity());
					return expr(static_cast<float>(1.1447298858494001741434273513531-
						std::log(std::abs(std::sin(3.1415926535897932384626433832795*f)))-lgamma(1.0-arg)));
				}
				return expr(static_cast<float>(lgamma(static_cast<double>(arg))));
			#endif
			}

			/// Gamma implementation.
			/// \param arg function argument
			/// \return function value stored in single-preicision
			static expr tgamma(float arg)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::tgamma(arg));
			#else
				if(arg == 0.0f)
					return builtin_signbit(arg) ? expr(-std::numeric_limits<float>::infinity()) : expr(std::numeric_limits<float>::infinity());
				if(arg < 0.0f)
				{
					float i, f = std::modf(-arg, &i);
					if(f == 0.0f)
						return expr(std::numeric_limits<float>::quiet_NaN());
					double value = 3.1415926535897932384626433832795 / (std::sin(3.1415926535897932384626433832795*f)*std::exp(lgamma(1.0-arg)));
					return expr(static_cast<float>((std::fmod(i, 2.0f)==0.0f) ? -value : value));
				}
				if(builtin_isinf(arg))
					return expr(arg);
				return expr(static_cast<float>(std::exp(lgamma(static_cast<double>(arg)))));
			#endif
			}

			/// Floor implementation.
			/// \param arg value to round
			/// \return rounded value
			static half floor(half arg) { return half(binary, round_half<std::round_toward_neg_infinity>(arg.data_)); }

			/// Ceiling implementation.
			/// \param arg value to round
			/// \return rounded value
			static half ceil(half arg) { return half(binary, round_half<std::round_toward_infinity>(arg.data_)); }

			/// Truncation implementation.
			/// \param arg value to round
			/// \return rounded value
			static half trunc(half arg) { return half(binary, round_half<std::round_toward_zero>(arg.data_)); }

			/// Nearest integer implementation.
			/// \param arg value to round
			/// \return rounded value
			static half round(half arg) { return half(binary, round_half_up(arg.data_)); }

			/// Nearest integer implementation.
			/// \param arg value to round
			/// \return rounded value
			static long lround(half arg) { return detail::half2int_up<long>(arg.data_); }

			/// Nearest integer implementation.
			/// \param arg value to round
			/// \return rounded value
			static half rint(half arg) { return half(binary, round_half<half::round_style>(arg.data_)); }

			/// Nearest integer implementation.
			/// \param arg value to round
			/// \return rounded value
			static long lrint(half arg) { return detail::half2int<half::round_style,long>(arg.data_); }

		#if HALF_ENABLE_CPP11_LONG_LONG
			/// Nearest integer implementation.
			/// \param arg value to round
			/// \return rounded value
			static long long llround(half arg) { return detail::half2int_up<long long>(arg.data_); }

			/// Nearest integer implementation.
			/// \param arg value to round
			/// \return rounded value
			static long long llrint(half arg) { return detail::half2int<half::round_style,long long>(arg.data_); }
		#endif

			/// Decompression implementation.
			/// \param arg number to decompress
			/// \param exp address to store exponent at
			/// \return normalized significant
			static half frexp(half arg, int *exp)
			{
				int m = arg.data_ & 0x7FFF, e = -14;
				if(m >= 0x7C00 || !m)
					return *exp = 0, arg;
				for(; m<0x400; m<<=1,--e) ;
				return *exp = e+(m>>10), half(binary, (arg.data_&0x8000)|0x3800|(m&0x3FF));
			}

			/// Decompression implementation.
			/// \param arg number to decompress
			/// \param iptr address to store integer part at
			/// \return fractional part
			static half modf(half arg, half *iptr)
			{
				unsigned int e = arg.data_ & 0x7FFF;
				if(e >= 0x6400)
					return *iptr = arg, half(binary, arg.data_&(0x8000U|-(e>0x7C00)));
				if(e < 0x3C00)
					return iptr->data_ = arg.data_ & 0x8000, arg;
				e >>= 10;
				unsigned int mask = (1<<(25-e)) - 1, m = arg.data_ & mask;
				iptr->data_ = arg.data_ & ~mask;
				if(!m)
					return half(binary, arg.data_&0x8000);
				for(; m<0x400; m<<=1,--e) ;
				return half(binary, static_cast<uint16>((arg.data_&0x8000)|(e<<10)|(m&0x3FF)));
			}

			/// Scaling implementation.
			/// \param arg number to scale
			/// \param exp power of two to scale by
			/// \return scaled number
			static half scalbln(half arg, long exp)
			{
				unsigned int m = arg.data_ & 0x7FFF;
				if(m >= 0x7C00 || !m)
					return arg;
				for(; m<0x400; m<<=1,--exp) ;
				exp += m >> 10;
				uint16 value = arg.data_ & 0x8000;
				if(exp > 30)
				{
					if(half::round_style == std::round_toward_zero)
						value |= 0x7BFF;
					else if(half::round_style == std::round_toward_infinity)
						value |= 0x7C00 - (value>>15);
					else if(half::round_style == std::round_toward_neg_infinity)
						value |= 0x7BFF + (value>>15);
					else
						value |= 0x7C00;
				}
				else if(exp > 0)
					value |= (exp<<10) | (m&0x3FF);
				else if(exp > -11)
				{
					m = (m&0x3FF) | 0x400;
					if(half::round_style == std::round_to_nearest)
					{
						m += 1 << -exp;
					#if HALF_ROUND_TIES_TO_EVEN
						m -= (m>>(1-exp)) & 1;
					#endif
					}
					else if(half::round_style == std::round_toward_infinity)
						m += ((value>>15)-1) & ((1<<(1-exp))-1U);
					else if(half::round_style == std::round_toward_neg_infinity)
						m += -(value>>15) & ((1<<(1-exp))-1U);
					value |= m >> (1-exp);
				}
				else if(half::round_style == std::round_toward_infinity)
					value -= (value>>15) - 1;
				else if(half::round_style == std::round_toward_neg_infinity)
					value += value >> 15;
				return half(binary, value);
			}

			/// Exponent implementation.
			/// \param arg number to query
			/// \return floating point exponent
			static int ilogb(half arg)
			{
				int abs = arg.data_ & 0x7FFF;
				if(!abs)
					return FP_ILOGB0;
				if(abs < 0x7C00)
				{
					int exp = (abs>>10) - 15;
					if(abs < 0x400)
						for(; abs<0x200; abs<<=1,--exp) ;
					return exp;
				}
				if(abs > 0x7C00)
					return FP_ILOGBNAN;
				return INT_MAX;
			}

			/// Exponent implementation.
			/// \param arg number to query
			/// \return floating point exponent
			static half logb(half arg)
			{
				int abs = arg.data_ & 0x7FFF;
				if(!abs)
					return half(binary, 0xFC00);
				if(abs < 0x7C00)
				{
					int exp = (abs>>10) - 15;
					if(abs < 0x400)
						for(; abs<0x200; abs<<=1,--exp) ;
					uint16 bits = (exp<0) << 15;
					if(exp)
					{
						unsigned int m = std::abs(exp) << 6, e = 18;
						for(; m<0x400; m<<=1,--e) ;
						bits |= (e<<10) + m;
					}
					return half(binary, bits);
				}
				if(abs > 0x7C00)
					return arg;
				return half(binary, 0x7C00);
			}

			/// Enumeration implementation.
			/// \param from number to increase/decrease
			/// \param to direction to enumerate into
			/// \return next representable number
			static half nextafter(half from, half to)
			{
				uint16 fabs = from.data_ & 0x7FFF, tabs = to.data_ & 0x7FFF;
				if(fabs > 0x7C00)
					return from;
				if(tabs > 0x7C00 || from.data_ == to.data_ || !(fabs|tabs))
					return to;
				if(!fabs)
					return half(binary, (to.data_&0x8000)+1);
				bool lt = ((fabs==from.data_) ? static_cast<int>(fabs) : -static_cast<int>(fabs)) < 
					((tabs==to.data_) ? static_cast<int>(tabs) : -static_cast<int>(tabs));
				return half(binary, from.data_+(((from.data_>>15)^static_cast<unsigned>(lt))<<1)-1);
			}

			/// Enumeration implementation.
			/// \param from number to increase/decrease
			/// \param to direction to enumerate into
			/// \return next representable number
			static half nexttoward(half from, long double to)
			{
				if(isnan(from))
					return from;
				long double lfrom = static_cast<long double>(from);
				if(builtin_isnan(to) || lfrom == to)
					return half(static_cast<float>(to));
				if(!(from.data_&0x7FFF))
					return half(binary, (static_cast<detail::uint16>(builtin_signbit(to))<<15)+1);
				return half(binary, from.data_+(((from.data_>>15)^static_cast<unsigned>(lfrom<to))<<1)-1);
			}

			/// Sign implementation
			/// \param x first operand
			/// \param y second operand
			/// \return composed value
			static half copysign(half x, half y) { return half(binary, x.data_^((x.data_^y.data_)&0x8000)); }

			/// Classification implementation.
			/// \param arg value to classify
			/// \retval true if infinite number
			/// \retval false else
			static int fpclassify(half arg)
			{
				unsigned int abs = arg.data_ & 0x7FFF;
				return abs ? ((abs>0x3FF) ? ((abs>=0x7C00) ? ((abs>0x7C00) ? FP_NAN : FP_INFINITE) : FP_NORMAL) :FP_SUBNORMAL) : FP_ZERO;
			}

			/// Classification implementation.
			/// \param arg value to classify
			/// \retval true if finite number
			/// \retval false else
			static bool isfinite(half arg) { return (arg.data_&0x7C00) != 0x7C00; }

			/// Classification implementation.
			/// \param arg value to classify
			/// \retval true if infinite number
			/// \retval false else
			static bool isinf(half arg) { return (arg.data_&0x7FFF) == 0x7C00; }

			/// Classification implementation.
			/// \param arg value to classify
			/// \retval true if not a number
			/// \retval false else
			static bool isnan(half arg) { return (arg.data_&0x7FFF) > 0x7C00; }

			/// Classification implementation.
			/// \param arg value to classify
			/// \retval true if normal number
			/// \retval false else
			static bool isnormal(half arg) { return ((arg.data_&0x7C00)!=0) & ((arg.data_&0x7C00)!=0x7C00); }

			/// Sign bit implementation.
			/// \param arg value to check
			/// \retval true if signed
			/// \retval false if unsigned
			static bool signbit(half arg) { return (arg.data_&0x8000) != 0; }

			/// Comparison implementation.
			/// \param x first operand
			/// \param y second operand
			/// \retval true if operands equal
			/// \retval false else
			static bool isequal(half x, half y) { return (x.data_==y.data_ || !((x.data_|y.data_)&0x7FFF)) && !isnan(x); }

			/// Comparison implementation.
			/// \param x first operand
			/// \param y second operand
			/// \retval true if operands not equal
			/// \retval false else
			static bool isnotequal(half x, half y) { return (x.data_!=y.data_ && ((x.data_|y.data_)&0x7FFF)) || isnan(x); }

			/// Comparison implementation.
			/// \param x first operand
			/// \param y second operand
			/// \retval true if \a x > \a y
			/// \retval false else
			static bool isgreater(half x, half y)
			{
				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
				return xabs<=0x7C00 && yabs<=0x7C00 && (((xabs==x.data_) ? xabs : -xabs) > ((yabs==y.data_) ? yabs : -yabs));
			}

			/// Comparison implementation.
			/// \param x first operand
			/// \param y second operand
			/// \retval true if \a x >= \a y
			/// \retval false else
			static bool isgreaterequal(half x, half y)
			{
				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
				return xabs<=0x7C00 && yabs<=0x7C00 && (((xabs==x.data_) ? xabs : -xabs) >= ((yabs==y.data_) ? yabs : -yabs));
			}

			/// Comparison implementation.
			/// \param x first operand
			/// \param y second operand
			/// \retval true if \a x < \a y
			/// \retval false else
			static bool isless(half x, half y)
			{
				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
				return xabs<=0x7C00 && yabs<=0x7C00 && (((xabs==x.data_) ? xabs : -xabs) < ((yabs==y.data_) ? yabs : -yabs));
			}

			/// Comparison implementation.
			/// \param x first operand
			/// \param y second operand
			/// \retval true if \a x <= \a y
			/// \retval false else
			static bool islessequal(half x, half y)
			{
				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
				return xabs<=0x7C00 && yabs<=0x7C00 && (((xabs==x.data_) ? xabs : -xabs) <= ((yabs==y.data_) ? yabs : -yabs));
			}

			/// Comparison implementation.
			/// \param x first operand
			/// \param y second operand
			/// \retval true if either \a x > \a y nor \a x < \a y
			/// \retval false else
			static bool islessgreater(half x, half y)
			{
				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
				if(xabs > 0x7C00 || yabs > 0x7C00)
					return false;
				int a = (xabs==x.data_) ? xabs : -xabs, b = (yabs==y.data_) ? yabs : -yabs;
				return a < b || a > b;
			}

			/// Comparison implementation.
			/// \param x first operand
			/// \param y second operand
			/// \retval true if operand unordered
			/// \retval false else
			static bool isunordered(half x, half y) { return isnan(x) || isnan(y); }

		private:
			static double erf(double arg)
			{
				if(builtin_isinf(arg))
					return (arg<0.0) ? -1.0 : 1.0;
				double x2 = arg * arg, ax2 = 0.147 * x2, value = std::sqrt(1.0-std::exp(-x2*(1.2732395447351626861510701069801+ax2)/(1.0+ax2)));
				return builtin_signbit(arg) ? -value : value;
			}

			static double lgamma(double arg)
			{
				double v = 1.0;
				for(; arg<8.0; ++arg) v *= arg;
				double w = 1.0 / (arg*arg);
				return (((((((-0.02955065359477124183006535947712*w+0.00641025641025641025641025641026)*w+
					-0.00191752691752691752691752691753)*w+8.4175084175084175084175084175084e-4)*w+
					-5.952380952380952380952380952381e-4)*w+7.9365079365079365079365079365079e-4)*w+
					-0.00277777777777777777777777777778)*w+0.08333333333333333333333333333333)/arg + 
					0.91893853320467274178032973640562 - std::log(v) - arg + (arg-0.5) * std::log(arg);
			}
		};

		/// Wrapper for unary half-precision functions needing specialization for individual argument types.
		/// \tparam T argument type
		template<typename T> struct unary_specialized
		{
			/// Negation implementation.
			/// \param arg value to negate
			/// \return negated value
			static HALF_CONSTEXPR half negate(half arg) { return half(binary, arg.data_^0x8000); }

			/// Absolute value implementation.
			/// \param arg function argument
			/// \return absolute value
			static half fabs(half arg) { return half(binary, arg.data_&0x7FFF); }
		};
		template<> struct unary_specialized<expr>
		{
			static HALF_CONSTEXPR expr negate(float arg) { return expr(-arg); }
			static expr fabs(float arg) { return expr(std::fabs(arg)); }
		};

		/// Wrapper for binary half-precision functions needing specialization for individual argument types.
		/// \tparam T first argument type
		/// \tparam U first argument type
		template<typename T,typename U> struct binary_specialized
		{
			/// Minimum implementation.
			/// \param x first operand
			/// \param y second operand
			/// \return minimum value
			static expr fmin(float x, float y)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::fmin(x, y));
			#else
				if(builtin_isnan(x))
					return expr(y);
				if(builtin_isnan(y))
					return expr(x);
				return expr(std::min(x, y));
			#endif
			}

			/// Maximum implementation.
			/// \param x first operand
			/// \param y second operand
			/// \return maximum value
			static expr fmax(float x, float y)
			{
			#if HALF_ENABLE_CPP11_CMATH
				return expr(std::fmax(x, y));
			#else
				if(builtin_isnan(x))
					return expr(y);
				if(builtin_isnan(y))
					return expr(x);
				return expr(std::max(x, y));
			#endif
			}
		};
		template<> struct binary_specialized<half,half>
		{
			static half fmin(half x, half y)
			{
				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
				if(xabs > 0x7C00)
					return y;
				if(yabs > 0x7C00)
					return x;
				return (((xabs==x.data_) ? xabs : -xabs) > ((yabs==y.data_) ? yabs : -yabs)) ? y : x;
			}
			static half fmax(half x, half y)
			{
				int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
				if(xabs > 0x7C00)
					return y;
				if(yabs > 0x7C00)
					return x;
				return (((xabs==x.data_) ? xabs : -xabs) < ((yabs==y.data_) ? yabs : -yabs)) ? y : x;
			}
		};

		/// Helper class for half casts.
		/// This class template has to be specialized for all valid cast argument to define an appropriate static `cast` member 
		/// function and a corresponding `type` member denoting its return type.
		/// \tparam T destination type
		/// \tparam U source type
		/// \tparam R rounding mode to use
		template<typename T,typename U,std::float_round_style R=(std::float_round_style)(HALF_ROUND_STYLE)> struct half_caster {};
		template<typename U,std::float_round_style R> struct half_caster<half,U,R>
		{
		#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
			static_assert(std::is_arithmetic<U>::value, "half_cast from non-arithmetic type unsupported");
		#endif

			static half cast(U arg) { return cast_impl(arg, is_float<U>()); };

		private:
			static half cast_impl(U arg, true_type) { return half(binary, float2half<R>(arg)); }
			static half cast_impl(U arg, false_type) { return half(binary, int2half<R>(arg)); }
		};
		template<typename T,std::float_round_style R> struct half_caster<T,half,R>
		{
		#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
			static_assert(std::is_arithmetic<T>::value, "half_cast to non-arithmetic type unsupported");
		#endif

			static T cast(half arg) { return cast_impl(arg, is_float<T>()); }

		private:
			static T cast_impl(half arg, true_type) { return half2float<T>(arg.data_); }
			static T cast_impl(half arg, false_type) { return half2int<R,T>(arg.data_); }
		};
		template<typename T,std::float_round_style R> struct half_caster<T,expr,R>
		{
		#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
			static_assert(std::is_arithmetic<T>::value, "half_cast to non-arithmetic type unsupported");
		#endif

			static T cast(expr arg) { return cast_impl(arg, is_float<T>()); }

		private:
			static T cast_impl(float arg, true_type) { return static_cast<T>(arg); }
			static T cast_impl(half arg, false_type) { return half2int<R,T>(arg.data_); }
		};
		template<std::float_round_style R> struct half_caster<half,half,R>
		{
			static half cast(half arg) { return arg; }
		};
		template<std::float_round_style R> struct half_caster<half,expr,R> : half_caster<half,half,R> {};

		/// \name Comparison operators
		/// \{

		/// Comparison for equality.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if operands equal
		/// \retval false else
		template<typename T,typename U> typename enable<bool,T,U>::type operator==(T x, U y) { return functions::isequal(x, y); }

		/// Comparison for inequality.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if operands not equal
		/// \retval false else
		template<typename T,typename U> typename enable<bool,T,U>::type operator!=(T x, U y) { return functions::isnotequal(x, y); }

		/// Comparison for less than.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if \a x less than \a y
		/// \retval false else
		template<typename T,typename U> typename enable<bool,T,U>::type operator<(T x, U y) { return functions::isless(x, y); }

		/// Comparison for greater than.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if \a x greater than \a y
		/// \retval false else
		template<typename T,typename U> typename enable<bool,T,U>::type operator>(T x, U y) { return functions::isgreater(x, y); }

		/// Comparison for less equal.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if \a x less equal \a y
		/// \retval false else
		template<typename T,typename U> typename enable<bool,T,U>::type operator<=(T x, U y) { return functions::islessequal(x, y); }

		/// Comparison for greater equal.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if \a x greater equal \a y
		/// \retval false else
		template<typename T,typename U> typename enable<bool,T,U>::type operator>=(T x, U y) { return functions::isgreaterequal(x, y); }

		/// \}
		/// \name Arithmetic operators
		/// \{

		/// Add halfs.
		/// \param x left operand
		/// \param y right operand
		/// \return sum of half expressions
		template<typename T,typename U> typename enable<expr,T,U>::type operator+(T x, U y) { return functions::plus(x, y); }

		/// Subtract halfs.
		/// \param x left operand
		/// \param y right operand
		/// \return difference of half expressions
		template<typename T,typename U> typename enable<expr,T,U>::type operator-(T x, U y) { return functions::minus(x, y); }

		/// Multiply halfs.
		/// \param x left operand
		/// \param y right operand
		/// \return product of half expressions
		template<typename T,typename U> typename enable<expr,T,U>::type operator*(T x, U y) { return functions::multiplies(x, y); }

		/// Divide halfs.
		/// \param x left operand
		/// \param y right operand
		/// \return quotient of half expressions
		template<typename T,typename U> typename enable<expr,T,U>::type operator/(T x, U y) { return functions::divides(x, y); }

		/// Identity.
		/// \param arg operand
		/// \return uncahnged operand
		template<typename T> HALF_CONSTEXPR typename enable<T,T>::type operator+(T arg) { return arg; }

		/// Negation.
		/// \param arg operand
		/// \return negated operand
		template<typename T> HALF_CONSTEXPR typename enable<T,T>::type operator-(T arg) { return unary_specialized<T>::negate(arg); }

		/// \}
		/// \name Input and output
		/// \{

		/// Output operator.
		/// \param out output stream to write into
		/// \param arg half expression to write
		/// \return reference to output stream
		template<typename T,typename charT,typename traits> typename enable<std::basic_ostream<charT,traits>&,T>::type
			operator<<(std::basic_ostream<charT,traits> &out, T arg) { return functions::write(out, arg); }

		/// Input operator.
		/// \param in input stream to read from
		/// \param arg half to read into
		/// \return reference to input stream
		template<typename charT,typename traits> std::basic_istream<charT,traits>&
			operator>>(std::basic_istream<charT,traits> &in, half &arg) { return functions::read(in, arg); }

		/// \}
		/// \name Basic mathematical operations
		/// \{

		/// Absolute value.
		/// \param arg operand
		/// \return absolute value of \a arg
//		template<typename T> typename enable<T,T>::type abs(T arg) { return unary_specialized<T>::fabs(arg); }
		inline half abs(half arg) { return unary_specialized<half>::fabs(arg); }
		inline expr abs(expr arg) { return unary_specialized<expr>::fabs(arg); }

		/// Absolute value.
		/// \param arg operand
		/// \return absolute value of \a arg
//		template<typename T> typename enable<T,T>::type fabs(T arg) { return unary_specialized<T>::fabs(arg); }
		inline half fabs(half arg) { return unary_specialized<half>::fabs(arg); }
		inline expr fabs(expr arg) { return unary_specialized<expr>::fabs(arg); }

		/// Remainder of division.
		/// \param x first operand
		/// \param y second operand
		/// \return remainder of floating point division.
//		template<typename T,typename U> typename enable<expr,T,U>::type fmod(T x, U y) { return functions::fmod(x, y); }
		inline expr fmod(half x, half y) { return functions::fmod(x, y); }
		inline expr fmod(half x, expr y) { return functions::fmod(x, y); }
		inline expr fmod(expr x, half y) { return functions::fmod(x, y); }
		inline expr fmod(expr x, expr y) { return functions::fmod(x, y); }

		/// Remainder of division.
		/// \param x first operand
		/// \param y second operand
		/// \return remainder of floating point division.
//		template<typename T,typename U> typename enable<expr,T,U>::type remainder(T x, U y) { return functions::remainder(x, y); }
		inline expr remainder(half x, half y) { return functions::remainder(x, y); }
		inline expr remainder(half x, expr y) { return functions::remainder(x, y); }
		inline expr remainder(expr x, half y) { return functions::remainder(x, y); }
		inline expr remainder(expr x, expr y) { return functions::remainder(x, y); }

		/// Remainder of division.
		/// \param x first operand
		/// \param y second operand
		/// \param quo address to store some bits of quotient at
		/// \return remainder of floating point division.
//		template<typename T,typename U> typename enable<expr,T,U>::type remquo(T x, U y, int *quo) { return functions::remquo(x, y, quo); }
		inline expr remquo(half x, half y, int *quo) { return functions::remquo(x, y, quo); }
		inline expr remquo(half x, expr y, int *quo) { return functions::remquo(x, y, quo); }
		inline expr remquo(expr x, half y, int *quo) { return functions::remquo(x, y, quo); }
		inline expr remquo(expr x, expr y, int *quo) { return functions::remquo(x, y, quo); }

		/// Fused multiply add.
		/// \param x first operand
		/// \param y second operand
		/// \param z third operand
		/// \return ( \a x * \a y ) + \a z rounded as one operation.
//		template<typename T,typename U,typename V> typename enable<expr,T,U,V>::type fma(T x, U y, V z) { return functions::fma(x, y, z); }
		inline expr fma(half x, half y, half z) { return functions::fma(x, y, z); }
		inline expr fma(half x, half y, expr z) { return functions::fma(x, y, z); }
		inline expr fma(half x, expr y, half z) { return functions::fma(x, y, z); }
		inline expr fma(half x, expr y, expr z) { return functions::fma(x, y, z); }
		inline expr fma(expr x, half y, half z) { return functions::fma(x, y, z); }
		inline expr fma(expr x, half y, expr z) { return functions::fma(x, y, z); }
		inline expr fma(expr x, expr y, half z) { return functions::fma(x, y, z); }
		inline expr fma(expr x, expr y, expr z) { return functions::fma(x, y, z); }

		/// Maximum of half expressions.
		/// \param x first operand
		/// \param y second operand
		/// \return maximum of operands
//		template<typename T,typename U> typename result<T,U>::type fmax(T x, U y) { return binary_specialized<T,U>::fmax(x, y); }
		inline half fmax(half x, half y) { return binary_specialized<half,half>::fmax(x, y); }
		inline expr fmax(half x, expr y) { return binary_specialized<half,expr>::fmax(x, y); }
		inline expr fmax(expr x, half y) { return binary_specialized<expr,half>::fmax(x, y); }
		inline expr fmax(expr x, expr y) { return binary_specialized<expr,expr>::fmax(x, y); }

		/// Minimum of half expressions.
		/// \param x first operand
		/// \param y second operand
		/// \return minimum of operands
//		template<typename T,typename U> typename result<T,U>::type fmin(T x, U y) { return binary_specialized<T,U>::fmin(x, y); }
		inline half fmin(half x, half y) { return binary_specialized<half,half>::fmin(x, y); }
		inline expr fmin(half x, expr y) { return binary_specialized<half,expr>::fmin(x, y); }
		inline expr fmin(expr x, half y) { return binary_specialized<expr,half>::fmin(x, y); }
		inline expr fmin(expr x, expr y) { return binary_specialized<expr,expr>::fmin(x, y); }

		/// Positive difference.
		/// \param x first operand
		/// \param y second operand
		/// \return \a x - \a y or 0 if difference negative
//		template<typename T,typename U> typename enable<expr,T,U>::type fdim(T x, U y) { return functions::fdim(x, y); }
		inline expr fdim(half x, half y) { return functions::fdim(x, y); }
		inline expr fdim(half x, expr y) { return functions::fdim(x, y); }
		inline expr fdim(expr x, half y) { return functions::fdim(x, y); }
		inline expr fdim(expr x, expr y) { return functions::fdim(x, y); }

		/// Get NaN value.
		/// \return quiet NaN
		inline half nanh(const char*) { return functions::nanh(); }

		/// \}
		/// \name Exponential functions
		/// \{

		/// Exponential function.
		/// \param arg function argument
		/// \return e raised to \a arg
//		template<typename T> typename enable<expr,T>::type exp(T arg) { return functions::exp(arg); }
		inline expr exp(half arg) { return functions::exp(arg); }
		inline expr exp(expr arg) { return functions::exp(arg); }

		/// Exponential minus one.
		/// \param arg function argument
		/// \return e raised to \a arg subtracted by 1
//		template<typename T> typename enable<expr,T>::type expm1(T arg) { return functions::expm1(arg); }
		inline expr expm1(half arg) { return functions::expm1(arg); }
		inline expr expm1(expr arg) { return functions::expm1(arg); }

		/// Binary exponential.
		/// \param arg function argument
		/// \return 2 raised to \a arg
//		template<typename T> typename enable<expr,T>::type exp2(T arg) { return functions::exp2(arg); }
		inline expr exp2(half arg) { return functions::exp2(arg); }
		inline expr exp2(expr arg) { return functions::exp2(arg); }

		/// Natural logorithm.
		/// \param arg function argument
		/// \return logarithm of \a arg to base e
//		template<typename T> typename enable<expr,T>::type log(T arg) { return functions::log(arg); }
		inline expr log(half arg) { return functions::log(arg); }
		inline expr log(expr arg) { return functions::log(arg); }

		/// Common logorithm.
		/// \param arg function argument
		/// \return logarithm of \a arg to base 10
//		template<typename T> typename enable<expr,T>::type log10(T arg) { return functions::log10(arg); }
		inline expr log10(half arg) { return functions::log10(arg); }
		inline expr log10(expr arg) { return functions::log10(arg); }

		/// Natural logorithm.
		/// \param arg function argument
		/// \return logarithm of \a arg plus 1 to base e
//		template<typename T> typename enable<expr,T>::type log1p(T arg) { return functions::log1p(arg); }
		inline expr log1p(half arg) { return functions::log1p(arg); }
		inline expr log1p(expr arg) { return functions::log1p(arg); }

		/// Binary logorithm.
		/// \param arg function argument
		/// \return logarithm of \a arg to base 2
//		template<typename T> typename enable<expr,T>::type log2(T arg) { return functions::log2(arg); }
		inline expr log2(half arg) { return functions::log2(arg); }
		inline expr log2(expr arg) { return functions::log2(arg); }

		/// \}
		/// \name Power functions
		/// \{

		/// Square root.
		/// \param arg function argument
		/// \return square root of \a arg
//		template<typename T> typename enable<expr,T>::type sqrt(T arg) { return functions::sqrt(arg); }
		inline expr sqrt(half arg) { return functions::sqrt(arg); }
		inline expr sqrt(expr arg) { return functions::sqrt(arg); }

		/// Cubic root.
		/// \param arg function argument
		/// \return cubic root of \a arg
//		template<typename T> typename enable<expr,T>::type cbrt(T arg) { return functions::cbrt(arg); }
		inline expr cbrt(half arg) { return functions::cbrt(arg); }
		inline expr cbrt(expr arg) { return functions::cbrt(arg); }

		/// Hypotenuse function.
		/// \param x first argument
		/// \param y second argument
		/// \return square root of sum of squares without internal over- or underflows
//		template<typename T,typename U> typename enable<expr,T,U>::type hypot(T x, U y) { return functions::hypot(x, y); }
		inline expr hypot(half x, half y) { return functions::hypot(x, y); }
		inline expr hypot(half x, expr y) { return functions::hypot(x, y); }
		inline expr hypot(expr x, half y) { return functions::hypot(x, y); }
		inline expr hypot(expr x, expr y) { return functions::hypot(x, y); }

		/// Power function.
		/// \param base first argument
		/// \param exp second argument
		/// \return \a base raised to \a exp
//		template<typename T,typename U> typename enable<expr,T,U>::type pow(T base, U exp) { return functions::pow(base, exp); }
		inline expr pow(half base, half exp) { return functions::pow(base, exp); }
		inline expr pow(half base, expr exp) { return functions::pow(base, exp); }
		inline expr pow(expr base, half exp) { return functions::pow(base, exp); }
		inline expr pow(expr base, expr exp) { return functions::pow(base, exp); }

		/// \}
		/// \name Trigonometric functions
		/// \{

		/// Sine function.
		/// \param arg function argument
		/// \return sine value of \a arg
//		template<typename T> typename enable<expr,T>::type sin(T arg) { return functions::sin(arg); }
		inline expr sin(half arg) { return functions::sin(arg); }
		inline expr sin(expr arg) { return functions::sin(arg); }

		/// Cosine function.
		/// \param arg function argument
		/// \return cosine value of \a arg
//		template<typename T> typename enable<expr,T>::type cos(T arg) { return functions::cos(arg); }
		inline expr cos(half arg) { return functions::cos(arg); }
		inline expr cos(expr arg) { return functions::cos(arg); }

		/// Tangent function.
		/// \param arg function argument
		/// \return tangent value of \a arg
//		template<typename T> typename enable<expr,T>::type tan(T arg) { return functions::tan(arg); }
		inline expr tan(half arg) { return functions::tan(arg); }
		inline expr tan(expr arg) { return functions::tan(arg); }

		/// Arc sine.
		/// \param arg function argument
		/// \return arc sine value of \a arg
//		template<typename T> typename enable<expr,T>::type asin(T arg) { return functions::asin(arg); }
		inline expr asin(half arg) { return functions::asin(arg); }
		inline expr asin(expr arg) { return functions::asin(arg); }

		/// Arc cosine function.
		/// \param arg function argument
		/// \return arc cosine value of \a arg
//		template<typename T> typename enable<expr,T>::type acos(T arg) { return functions::acos(arg); }
		inline expr acos(half arg) { return functions::acos(arg); }
		inline expr acos(expr arg) { return functions::acos(arg); }

		/// Arc tangent function.
		/// \param arg function argument
		/// \return arc tangent value of \a arg
//		template<typename T> typename enable<expr,T>::type atan(T arg) { return functions::atan(arg); }
		inline expr atan(half arg) { return functions::atan(arg); }
		inline expr atan(expr arg) { return functions::atan(arg); }

		/// Arc tangent function.
		/// \param x first argument
		/// \param y second argument
		/// \return arc tangent value
//		template<typename T,typename U> typename enable<expr,T,U>::type atan2(T x, U y) { return functions::atan2(x, y); }
		inline expr atan2(half x, half y) { return functions::atan2(x, y); }
		inline expr atan2(half x, expr y) { return functions::atan2(x, y); }
		inline expr atan2(expr x, half y) { return functions::atan2(x, y); }
		inline expr atan2(expr x, expr y) { return functions::atan2(x, y); }

		/// \}
		/// \name Hyperbolic functions
		/// \{

		/// Hyperbolic sine.
		/// \param arg function argument
		/// \return hyperbolic sine value of \a arg
//		template<typename T> typename enable<expr,T>::type sinh(T arg) { return functions::sinh(arg); }
		inline expr sinh(half arg) { return functions::sinh(arg); }
		inline expr sinh(expr arg) { return functions::sinh(arg); }

		/// Hyperbolic cosine.
		/// \param arg function argument
		/// \return hyperbolic cosine value of \a arg
//		template<typename T> typename enable<expr,T>::type cosh(T arg) { return functions::cosh(arg); }
		inline expr cosh(half arg) { return functions::cosh(arg); }
		inline expr cosh(expr arg) { return functions::cosh(arg); }

		/// Hyperbolic tangent.
		/// \param arg function argument
		/// \return hyperbolic tangent value of \a arg
//		template<typename T> typename enable<expr,T>::type tanh(T arg) { return functions::tanh(arg); }
		inline expr tanh(half arg) { return functions::tanh(arg); }
		inline expr tanh(expr arg) { return functions::tanh(arg); }

		/// Hyperbolic area sine.
		/// \param arg function argument
		/// \return area sine value of \a arg
//		template<typename T> typename enable<expr,T>::type asinh(T arg) { return functions::asinh(arg); }
		inline expr asinh(half arg) { return functions::asinh(arg); }
		inline expr asinh(expr arg) { return functions::asinh(arg); }

		/// Hyperbolic area cosine.
		/// \param arg function argument
		/// \return area cosine value of \a arg
//		template<typename T> typename enable<expr,T>::type acosh(T arg) { return functions::acosh(arg); }
		inline expr acosh(half arg) { return functions::acosh(arg); }
		inline expr acosh(expr arg) { return functions::acosh(arg); }

		/// Hyperbolic area tangent.
		/// \param arg function argument
		/// \return area tangent value of \a arg
//		template<typename T> typename enable<expr,T>::type atanh(T arg) { return functions::atanh(arg); }
		inline expr atanh(half arg) { return functions::atanh(arg); }
		inline expr atanh(expr arg) { return functions::atanh(arg); }

		/// \}
		/// \name Error and gamma functions
		/// \{

		/// Error function.
		/// \param arg function argument
		/// \return error function value of \a arg
//		template<typename T> typename enable<expr,T>::type erf(T arg) { return functions::erf(arg); }
		inline expr erf(half arg) { return functions::erf(arg); }
		inline expr erf(expr arg) { return functions::erf(arg); }

		/// Complementary error function.
		/// \param arg function argument
		/// \return 1 minus error function value of \a arg
//		template<typename T> typename enable<expr,T>::type erfc(T arg) { return functions::erfc(arg); }
		inline expr erfc(half arg) { return functions::erfc(arg); }
		inline expr erfc(expr arg) { return functions::erfc(arg); }

		/// Natural logarithm of gamma function.
		/// \param arg function argument
		/// \return natural logarith of gamma function for \a arg
//		template<typename T> typename enable<expr,T>::type lgamma(T arg) { return functions::lgamma(arg); }
		inline expr lgamma(half arg) { return functions::lgamma(arg); }
		inline expr lgamma(expr arg) { return functions::lgamma(arg); }

		/// Gamma function.
		/// \param arg function argument
		/// \return gamma function value of \a arg
//		template<typename T> typename enable<expr,T>::type tgamma(T arg) { return functions::tgamma(arg); }
		inline expr tgamma(half arg) { return functions::tgamma(arg); }
		inline expr tgamma(expr arg) { return functions::tgamma(arg); }

		/// \}
		/// \name Rounding
		/// \{

		/// Nearest integer not less than half value.
		/// \param arg half to round
		/// \return nearest integer not less than \a arg
//		template<typename T> typename enable<half,T>::type ceil(T arg) { return functions::ceil(arg); }
		inline half ceil(half arg) { return functions::ceil(arg); }
		inline half ceil(expr arg) { return functions::ceil(arg); }

		/// Nearest integer not greater than half value.
		/// \param arg half to round
		/// \return nearest integer not greater than \a arg
//		template<typename T> typename enable<half,T>::type floor(T arg) { return functions::floor(arg); }
		inline half floor(half arg) { return functions::floor(arg); }
		inline half floor(expr arg) { return functions::floor(arg); }

		/// Nearest integer not greater in magnitude than half value.
		/// \param arg half to round
		/// \return nearest integer not greater in magnitude than \a arg
//		template<typename T> typename enable<half,T>::type trunc(T arg) { return functions::trunc(arg); }
		inline half trunc(half arg) { return functions::trunc(arg); }
		inline half trunc(expr arg) { return functions::trunc(arg); }

		/// Nearest integer.
		/// \param arg half to round
		/// \return nearest integer, rounded away from zero in half-way cases
//		template<typename T> typename enable<half,T>::type round(T arg) { return functions::round(arg); }
		inline half round(half arg) { return functions::round(arg); }
		inline half round(expr arg) { return functions::round(arg); }

		/// Nearest integer.
		/// \param arg half to round
		/// \return nearest integer, rounded away from zero in half-way cases
//		template<typename T> typename enable<long,T>::type lround(T arg) { return functions::lround(arg); }
		inline long lround(half arg) { return functions::lround(arg); }
		inline long lround(expr arg) { return functions::lround(arg); }

		/// Nearest integer using half's internal rounding mode.
		/// \param arg half expression to round
		/// \return nearest integer using default rounding mode
//		template<typename T> typename enable<half,T>::type nearbyint(T arg) { return functions::nearbyint(arg); }
		inline half nearbyint(half arg) { return functions::rint(arg); }
		inline half nearbyint(expr arg) { return functions::rint(arg); }

		/// Nearest integer using half's internal rounding mode.
		/// \param arg half expression to round
		/// \return nearest integer using default rounding mode
//		template<typename T> typename enable<half,T>::type rint(T arg) { return functions::rint(arg); }
		inline half rint(half arg) { return functions::rint(arg); }
		inline half rint(expr arg) { return functions::rint(arg); }

		/// Nearest integer using half's internal rounding mode.
		/// \param arg half expression to round
		/// \return nearest integer using default rounding mode
//		template<typename T> typename enable<long,T>::type lrint(T arg) { return functions::lrint(arg); }
		inline long lrint(half arg) { return functions::lrint(arg); }
		inline long lrint(expr arg) { return functions::lrint(arg); }
	#if HALF_ENABLE_CPP11_LONG_LONG
		/// Nearest integer.
		/// \param arg half to round
		/// \return nearest integer, rounded away from zero in half-way cases
//		template<typename T> typename enable<long long,T>::type llround(T arg) { return functions::llround(arg); }
		inline long long llround(half arg) { return functions::llround(arg); }
		inline long long llround(expr arg) { return functions::llround(arg); }

		/// Nearest integer using half's internal rounding mode.
		/// \param arg half expression to round
		/// \return nearest integer using default rounding mode
//		template<typename T> typename enable<long long,T>::type llrint(T arg) { return functions::llrint(arg); }
		inline long long llrint(half arg) { return functions::llrint(arg); }
		inline long long llrint(expr arg) { return functions::llrint(arg); }
	#endif

		/// \}
		/// \name Floating point manipulation
		/// \{

		/// Decompress floating point number.
		/// \param arg number to decompress
		/// \param exp address to store exponent at
		/// \return significant in range [0.5, 1)
//		template<typename T> typename enable<half,T>::type frexp(T arg, int *exp) { return functions::frexp(arg, exp); }
		inline half frexp(half arg, int *exp) { return functions::frexp(arg, exp); }
		inline half frexp(expr arg, int *exp) { return functions::frexp(arg, exp); }

		/// Multiply by power of two.
		/// \param arg number to modify
		/// \param exp power of two to multiply with
		/// \return \a arg multplied by 2 raised to \a exp
//		template<typename T> typename enable<half,T>::type ldexp(T arg, int exp) { return functions::scalbln(arg, exp); }
		inline half ldexp(half arg, int exp) { return functions::scalbln(arg, exp); }
		inline half ldexp(expr arg, int exp) { return functions::scalbln(arg, exp); }

		/// Extract integer and fractional parts.
		/// \param arg number to decompress
		/// \param iptr address to store integer part at
		/// \return fractional part
//		template<typename T> typename enable<half,T>::type modf(T arg, half *iptr) { return functions::modf(arg, iptr); }
		inline half modf(half arg, half *iptr) { return functions::modf(arg, iptr); }
		inline half modf(expr arg, half *iptr) { return functions::modf(arg, iptr); }

		/// Multiply by power of two.
		/// \param arg number to modify
		/// \param exp power of two to multiply with
		/// \return \a arg multplied by 2 raised to \a exp
//		template<typename T> typename enable<half,T>::type scalbn(T arg, int exp) { return functions::scalbln(arg, exp); }
		inline half scalbn(half arg, int exp) { return functions::scalbln(arg, exp); }
		inline half scalbn(expr arg, int exp) { return functions::scalbln(arg, exp); }

		/// Multiply by power of two.
		/// \param arg number to modify
		/// \param exp power of two to multiply with
		/// \return \a arg multplied by 2 raised to \a exp	
//		template<typename T> typename enable<half,T>::type scalbln(T arg, long exp) { return functions::scalbln(arg, exp); }
		inline half scalbln(half arg, long exp) { return functions::scalbln(arg, exp); }
		inline half scalbln(expr arg, long exp) { return functions::scalbln(arg, exp); }

		/// Extract exponent.
		/// \param arg number to query
		/// \return floating point exponent
		/// \retval FP_ILOGB0 for zero
		/// \retval FP_ILOGBNAN for NaN
		/// \retval MAX_INT for infinity
//		template<typename T> typename enable<int,T>::type ilogb(T arg) { return functions::ilogb(arg); }
		inline int ilogb(half arg) { return functions::ilogb(arg); }
		inline int ilogb(expr arg) { return functions::ilogb(arg); }

		/// Extract exponent.
		/// \param arg number to query
		/// \return floating point exponent
//		template<typename T> typename enable<half,T>::type logb(T arg) { return functions::logb(arg); }
		inline half logb(half arg) { return functions::logb(arg); }
		inline half logb(expr arg) { return functions::logb(arg); }

		/// Next representable value.
		/// \param from value to compute next representable value for
		/// \param to direction towards which to compute next value
		/// \return next representable value after \a from in direction towards \a to
//		template<typename T,typename U> typename enable<half,T,U>::type nextafter(T from, U to) { return functions::nextafter(from, to); }
		inline half nextafter(half from, half to) { return functions::nextafter(from, to); }
		inline half nextafter(half from, expr to) { return functions::nextafter(from, to); }
		inline half nextafter(expr from, half to) { return functions::nextafter(from, to); }
		inline half nextafter(expr from, expr to) { return functions::nextafter(from, to); }

		/// Next representable value.
		/// \param from value to compute next representable value for
		/// \param to direction towards which to compute next value
		/// \return next representable value after \a from in direction towards \a to
//		template<typename T> typename enable<half,T>::type nexttoward(T from, long double to) { return functions::nexttoward(from, to); }
		inline half nexttoward(half from, long double to) { return functions::nexttoward(from, to); }
		inline half nexttoward(expr from, long double to) { return functions::nexttoward(from, to); }

		/// Take sign.
		/// \param x value to change sign for
		/// \param y value to take sign from
		/// \return value equal to \a x in magnitude and to \a y in sign
//		template<typename T,typename U> typename enable<half,T,U>::type copysign(T x, U y) { return functions::copysign(x, y); }
		inline half copysign(half x, half y) { return functions::copysign(x, y); }
		inline half copysign(half x, expr y) { return functions::copysign(x, y); }
		inline half copysign(expr x, half y) { return functions::copysign(x, y); }
		inline half copysign(expr x, expr y) { return functions::copysign(x, y); }

		/// \}
		/// \name Floating point classification
		/// \{


		/// Classify floating point value.
		/// \param arg number to classify
		/// \retval FP_ZERO for positive and negative zero
		/// \retval FP_SUBNORMAL for subnormal numbers
		/// \retval FP_INFINITY for positive and negative infinity
		/// \retval FP_NAN for NaNs
		/// \retval FP_NORMAL for all other (normal) values
//		template<typename T> typename enable<int,T>::type fpclassify(T arg) { return functions::fpclassify(arg); }
		inline int fpclassify(half arg) { return functions::fpclassify(arg); }
		inline int fpclassify(expr arg) { return functions::fpclassify(arg); }

		/// Check if finite number.
		/// \param arg number to check
		/// \retval true if neither infinity nor NaN
		/// \retval false else
//		template<typename T> typename enable<bool,T>::type isfinite(T arg) { return functions::isfinite(arg); }
		inline bool isfinite(half arg) { return functions::isfinite(arg); }
		inline bool isfinite(expr arg) { return functions::isfinite(arg); }

		/// Check for infinity.
		/// \param arg number to check
		/// \retval true for positive or negative infinity
		/// \retval false else
//		template<typename T> typename enable<bool,T>::type isinf(T arg) { return functions::isinf(arg); }
		inline bool isinf(half arg) { return functions::isinf(arg); }
		inline bool isinf(expr arg) { return functions::isinf(arg); }

		/// Check for NaN.
		/// \param arg number to check
		/// \retval true for NaNs
		/// \retval false else
//		template<typename T> typename enable<bool,T>::type isnan(T arg) { return functions::isnan(arg); }
		inline bool isnan(half arg) { return functions::isnan(arg); }
		inline bool isnan(expr arg) { return functions::isnan(arg); }

		/// Check if normal number.
		/// \param arg number to check
		/// \retval true if normal number
		/// \retval false if either subnormal, zero, infinity or NaN
//		template<typename T> typename enable<bool,T>::type isnormal(T arg) { return functions::isnormal(arg); }
		inline bool isnormal(half arg) { return functions::isnormal(arg); }
		inline bool isnormal(expr arg) { return functions::isnormal(arg); }

		/// Check sign.
		/// \param arg number to check
		/// \retval true for negative number
		/// \retval false for positive number
//		template<typename T> typename enable<bool,T>::type signbit(T arg) { return functions::signbit(arg); }
		inline bool signbit(half arg) { return functions::signbit(arg); }
		inline bool signbit(expr arg) { return functions::signbit(arg); }

		/// \}
		/// \name Comparison
		/// \{

		/// Comparison for greater than.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if \a x greater than \a y
		/// \retval false else
//		template<typename T,typename U> typename enable<bool,T,U>::type isgreater(T x, U y) { return functions::isgreater(x, y); }
		inline bool isgreater(half x, half y) { return functions::isgreater(x, y); }
		inline bool isgreater(half x, expr y) { return functions::isgreater(x, y); }
		inline bool isgreater(expr x, half y) { return functions::isgreater(x, y); }
		inline bool isgreater(expr x, expr y) { return functions::isgreater(x, y); }

		/// Comparison for greater equal.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if \a x greater equal \a y
		/// \retval false else
//		template<typename T,typename U> typename enable<bool,T,U>::type isgreaterequal(T x, U y) { return functions::isgreaterequal(x, y); }
		inline bool isgreaterequal(half x, half y) { return functions::isgreaterequal(x, y); }
		inline bool isgreaterequal(half x, expr y) { return functions::isgreaterequal(x, y); }
		inline bool isgreaterequal(expr x, half y) { return functions::isgreaterequal(x, y); }
		inline bool isgreaterequal(expr x, expr y) { return functions::isgreaterequal(x, y); }

		/// Comparison for less than.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if \a x less than \a y
		/// \retval false else
//		template<typename T,typename U> typename enable<bool,T,U>::type isless(T x, U y) { return functions::isless(x, y); }
		inline bool isless(half x, half y) { return functions::isless(x, y); }
		inline bool isless(half x, expr y) { return functions::isless(x, y); }
		inline bool isless(expr x, half y) { return functions::isless(x, y); }
		inline bool isless(expr x, expr y) { return functions::isless(x, y); }

		/// Comparison for less equal.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if \a x less equal \a y
		/// \retval false else
//		template<typename T,typename U> typename enable<bool,T,U>::type islessequal(T x, U y) { return functions::islessequal(x, y); }
		inline bool islessequal(half x, half y) { return functions::islessequal(x, y); }
		inline bool islessequal(half x, expr y) { return functions::islessequal(x, y); }
		inline bool islessequal(expr x, half y) { return functions::islessequal(x, y); }
		inline bool islessequal(expr x, expr y) { return functions::islessequal(x, y); }

		/// Comarison for less or greater.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if either less or greater
		/// \retval false else
//		template<typename T,typename U> typename enable<bool,T,U>::type islessgreater(T x, U y) { return functions::islessgreater(x, y); }
		inline bool islessgreater(half x, half y) { return functions::islessgreater(x, y); }
		inline bool islessgreater(half x, expr y) { return functions::islessgreater(x, y); }
		inline bool islessgreater(expr x, half y) { return functions::islessgreater(x, y); }
		inline bool islessgreater(expr x, expr y) { return functions::islessgreater(x, y); }

		/// Check if unordered.
		/// \param x first operand
		/// \param y second operand
		/// \retval true if unordered (one or two NaN operands)
		/// \retval false else
//		template<typename T,typename U> typename enable<bool,T,U>::type isunordered(T x, U y) { return functions::isunordered(x, y); }
		inline bool isunordered(half x, half y) { return functions::isunordered(x, y); }
		inline bool isunordered(half x, expr y) { return functions::isunordered(x, y); }
		inline bool isunordered(expr x, half y) { return functions::isunordered(x, y); }
		inline bool isunordered(expr x, expr y) { return functions::isunordered(x, y); }

		/// \name Casting
		/// \{

		/// Cast to or from half-precision floating point number.
		/// This casts between [half](\ref half_float::half) and any built-in arithmetic type. The values are converted 
		/// directly using the given rounding mode, without any roundtrip over `float` that a `static_cast` would otherwise do. 
		/// It uses the default rounding mode.
		///
		/// Using this cast with neither of the two types being a [half](\ref half_float::half) or with any of the two types 
		/// not being a built-in arithmetic type (apart from [half](\ref half_float::half), of course) results in a compiler 
		/// error and casting between [half](\ref half_float::half)s is just a no-op.
		/// \tparam T destination type (half or built-in arithmetic type)
		/// \tparam U source type (half or built-in arithmetic type)
		/// \param arg value to cast
		/// \return \a arg converted to destination type
		template<typename T,typename U> T half_cast(U arg) { return half_caster<T,U>::cast(arg); }

		/// Cast to or from half-precision floating point number.
		/// This casts between [half](\ref half_float::half) and any built-in arithmetic type. The values are converted 
		/// directly using the given rounding mode, without any roundtrip over `float` that a `static_cast` would otherwise do.
		///
		/// Using this cast with neither of the two types being a [half](\ref half_float::half) or with any of the two types 
		/// not being a built-in arithmetic type (apart from [half](\ref half_float::half), of course) results in a compiler 
		/// error and casting between [half](\ref half_float::half)s is just a no-op.
		/// \tparam T destination type (half or built-in arithmetic type)
		/// \tparam R rounding mode to use.
		/// \tparam U source type (half or built-in arithmetic type)
		/// \param arg value to cast
		/// \return \a arg converted to destination type
		template<typename T,std::float_round_style R,typename U> T half_cast(U arg) { return half_caster<T,U,R>::cast(arg); }
		/// \}
	}

	using detail::operator==;
	using detail::operator!=;
	using detail::operator<;
	using detail::operator>;
	using detail::operator<=;
	using detail::operator>=;
	using detail::operator+;
	using detail::operator-;
	using detail::operator*;
	using detail::operator/;
	using detail::operator<<;
	using detail::operator>>;

	using detail::abs;
	using detail::fabs;
	using detail::fmod;
	using detail::remainder;
	using detail::remquo;
	using detail::fma;
	using detail::fmax;
	using detail::fmin;
	using detail::fdim;
	using detail::nanh;
	using detail::exp;
	using detail::expm1;
	using detail::exp2;
	using detail::log;
	using detail::log10;
	using detail::log1p;
	using detail::log2;
	using detail::sqrt;
	using detail::cbrt;
	using detail::hypot;
	using detail::pow;
	using detail::sin;
	using detail::cos;
	using detail::tan;
	using detail::asin;
	using detail::acos;
	using detail::atan;
	using detail::atan2;
	using detail::sinh;
	using detail::cosh;
	using detail::tanh;
	using detail::asinh;
	using detail::acosh;
	using detail::atanh;
	using detail::erf;
	using detail::erfc;
	using detail::lgamma;
	using detail::tgamma;
	using detail::ceil;
	using detail::floor;
	using detail::trunc;
	using detail::round;
	using detail::lround;
	using detail::nearbyint;
	using detail::rint;
	using detail::lrint;
#if HALF_ENABLE_CPP11_LONG_LONG
	using detail::llround;
	using detail::llrint;
#endif
	using detail::frexp;
	using detail::ldexp;
	using detail::modf;
	using detail::scalbn;
	using detail::scalbln;
	using detail::ilogb;
	using detail::logb;
	using detail::nextafter;
	using detail::nexttoward;
	using detail::copysign;
	using detail::fpclassify;
	using detail::isfinite;
	using detail::isinf;
	using detail::isnan;
	using detail::isnormal;
	using detail::signbit;
	using detail::isgreater;
	using detail::isgreaterequal;
	using detail::isless;
	using detail::islessequal;
	using detail::islessgreater;
	using detail::isunordered;

	using detail::half_cast;
}


/// Extensions to the C++ standard library.
namespace std
{
	/// Numeric limits for half-precision floats.
	/// Because of the underlying single-precision implementation of many operations, it inherits some properties from 
	/// `std::numeric_limits<float>`.
	template<> class numeric_limits<half_float::half> : public numeric_limits<float>
	{
	public:
		/// Supports signed values.
		static HALF_CONSTEXPR_CONST bool is_signed = true;

		/// Is not exact.
		static HALF_CONSTEXPR_CONST bool is_exact = false;

		/// Doesn't provide modulo arithmetic.
		static HALF_CONSTEXPR_CONST bool is_modulo = false;

		/// IEEE conformant.
		static HALF_CONSTEXPR_CONST bool is_iec559 = true;

		/// Supports infinity.
		static HALF_CONSTEXPR_CONST bool has_infinity = true;

		/// Supports quiet NaNs.
		static HALF_CONSTEXPR_CONST bool has_quiet_NaN = true;

		/// Supports subnormal values.
		static HALF_CONSTEXPR_CONST float_denorm_style has_denorm = denorm_present;

		/// Rounding mode.
		/// Due to the mix of internal single-precision computations (using the rounding mode of the underlying 
		/// single-precision implementation) with the rounding mode of the single-to-half conversions, the actual rounding 
		/// mode might be `std::round_indeterminate` if the default half-precision rounding mode doesn't match the 
		/// single-precision rounding mode.
		static HALF_CONSTEXPR_CONST float_round_style round_style = (std::numeric_limits<float>::round_style==
			half_float::half::round_style) ? half_float::half::round_style : round_indeterminate;

		/// Significant digits.
		static HALF_CONSTEXPR_CONST int digits = 11;

		/// Significant decimal digits.
		static HALF_CONSTEXPR_CONST int digits10 = 3;

		/// Required decimal digits to represent all possible values.
		static HALF_CONSTEXPR_CONST int max_digits10 = 5;

		/// Number base.
		static HALF_CONSTEXPR_CONST int radix = 2;

		/// One more than smallest exponent.
		static HALF_CONSTEXPR_CONST int min_exponent = -13;

		/// Smallest normalized representable power of 10.
		static HALF_CONSTEXPR_CONST int min_exponent10 = -4;

		/// One more than largest exponent
		static HALF_CONSTEXPR_CONST int max_exponent = 16;

		/// Largest finitely representable power of 10.
		static HALF_CONSTEXPR_CONST int max_exponent10 = 4;

		/// Smallest positive normal value.
		static HALF_CONSTEXPR half_float::half min() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x0400); }

		/// Smallest finite value.
		static HALF_CONSTEXPR half_float::half lowest() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0xFBFF); }

		/// Largest finite value.
		static HALF_CONSTEXPR half_float::half max() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7BFF); }

		/// Difference between one and next representable value.
		static HALF_CONSTEXPR half_float::half epsilon() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x1400); }

		/// Maximum rounding error.
		static HALF_CONSTEXPR half_float::half round_error() HALF_NOTHROW
			{ return half_float::half(half_float::detail::binary, (round_style==std::round_to_nearest) ? 0x3800 : 0x3C00); }

		/// Positive infinity.
		static HALF_CONSTEXPR half_float::half infinity() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7C00); }

		/// Quiet NaN.
		static HALF_CONSTEXPR half_float::half quiet_NaN() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7FFF); }

		/// Signalling NaN.
		static HALF_CONSTEXPR half_float::half signaling_NaN() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7DFF); }

		/// Smallest positive subnormal value.
		static HALF_CONSTEXPR half_float::half denorm_min() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x0001); }
	};

#if HALF_ENABLE_CPP11_HASH
	/// Hash function for half-precision floats.
	/// This is only defined if C++11 `std::hash` is supported and enabled.
	template<> struct hash<half_float::half> //: unary_function<half_float::half,size_t>
	{
		/// Type of function argument.
		typedef half_float::half argument_type;

		/// Function return type.
		typedef size_t result_type;

		/// Compute hash function.
		/// \param arg half to hash
		/// \return hash value
		result_type operator()(argument_type arg) const
			{ return hash<half_float::detail::uint16>()(static_cast<unsigned>(arg.data_)&-(arg.data_!=0x8000)); }
	};
#endif
}


#undef HALF_CONSTEXPR
#undef HALF_CONSTEXPR_CONST
#undef HALF_NOEXCEPT
#undef HALF_NOTHROW
#ifdef HALF_POP_WARNINGS
	#pragma warning(pop)
	#undef HALF_POP_WARNINGS
#endif

#endif
