42 #define HALF_GCC_VERSION (__GNUC__*100+__GNUC_MINOR__)
44 #if defined(__INTEL_COMPILER)
45 #define HALF_ICC_VERSION __INTEL_COMPILER
47 #define HALF_ICC_VERSION __ICC
49 #define HALF_ICC_VERSION __ICL
51 #define HALF_ICC_VERSION 0
55 #if defined(__clang__) // clang
56 #if __has_feature(cxx_static_assert) && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
57 #define HALF_ENABLE_CPP11_STATIC_ASSERT 1
59 #if __has_feature(cxx_constexpr) && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
60 #define HALF_ENABLE_CPP11_CONSTEXPR 1
62 #if __has_feature(cxx_noexcept) && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
63 #define HALF_ENABLE_CPP11_NOEXCEPT 1
65 #if __has_feature(cxx_user_literals) && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
66 #define HALF_ENABLE_CPP11_USER_LITERALS 1
68 #if __has_feature(cxx_thread_local) && !defined(HALF_ENABLE_CPP11_THREAD_LOCAL)
69 #define HALF_ENABLE_CPP11_THREAD_LOCAL 1
71 #if (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L) && !defined(HALF_ENABLE_CPP11_LONG_LONG)
72 #define HALF_ENABLE_CPP11_LONG_LONG 1
74 #elif HALF_ICC_VERSION && defined(__INTEL_CXX11_MODE__) // Intel C++
75 #if HALF_ICC_VERSION >= 1500 && !defined(HALF_ENABLE_CPP11_THREAD_LOCAL)
76 #define HALF_ENABLE_CPP11_THREAD_LOCAL 1
78 #if HALF_ICC_VERSION >= 1500 && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
79 #define HALF_ENABLE_CPP11_USER_LITERALS 1
81 #if HALF_ICC_VERSION >= 1400 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
82 #define HALF_ENABLE_CPP11_CONSTEXPR 1
84 #if HALF_ICC_VERSION >= 1400 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
85 #define HALF_ENABLE_CPP11_NOEXCEPT 1
87 #if HALF_ICC_VERSION >= 1110 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
88 #define HALF_ENABLE_CPP11_STATIC_ASSERT 1
90 #if HALF_ICC_VERSION >= 1110 && !defined(HALF_ENABLE_CPP11_LONG_LONG)
91 #define HALF_ENABLE_CPP11_LONG_LONG 1
93 #elif defined(__GNUC__) // gcc
94 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
95 #if HALF_GCC_VERSION >= 408 && !defined(HALF_ENABLE_CPP11_THREAD_LOCAL)
96 #define HALF_ENABLE_CPP11_THREAD_LOCAL 1
98 #if HALF_GCC_VERSION >= 407 && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
99 #define HALF_ENABLE_CPP11_USER_LITERALS 1
101 #if HALF_GCC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
102 #define HALF_ENABLE_CPP11_CONSTEXPR 1
104 #if HALF_GCC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
105 #define HALF_ENABLE_CPP11_NOEXCEPT 1
107 #if HALF_GCC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
108 #define HALF_ENABLE_CPP11_STATIC_ASSERT 1
110 #if !defined(HALF_ENABLE_CPP11_LONG_LONG)
111 #define HALF_ENABLE_CPP11_LONG_LONG 1
114 #define HALF_TWOS_COMPLEMENT_INT 1
115 #elif defined(_MSC_VER) // Visual C++
116 #if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_THREAD_LOCAL)
117 #define HALF_ENABLE_CPP11_THREAD_LOCAL 1
119 #if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
120 #define HALF_ENABLE_CPP11_USER_LITERALS 1
122 #if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
123 #define HALF_ENABLE_CPP11_CONSTEXPR 1
125 #if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
126 #define HALF_ENABLE_CPP11_NOEXCEPT 1
128 #if _MSC_VER >= 1600 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
129 #define HALF_ENABLE_CPP11_STATIC_ASSERT 1
131 #if _MSC_VER >= 1310 && !defined(HALF_ENABLE_CPP11_LONG_LONG)
132 #define HALF_ENABLE_CPP11_LONG_LONG 1
134 #define HALF_TWOS_COMPLEMENT_INT 1
135 #define HALF_POP_WARNINGS 1
136 #pragma warning(push)
137 #pragma warning(disable : 4099 4127 4146) //struct vs class, constant in if, negative unsigned
142 #if defined(_LIBCPP_VERSION) // libc++
143 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103
144 #ifndef HALF_ENABLE_CPP11_TYPE_TRAITS
145 #define HALF_ENABLE_CPP11_TYPE_TRAITS 1
147 #ifndef HALF_ENABLE_CPP11_CSTDINT
148 #define HALF_ENABLE_CPP11_CSTDINT 1
150 #ifndef HALF_ENABLE_CPP11_CMATH
151 #define HALF_ENABLE_CPP11_CMATH 1
153 #ifndef HALF_ENABLE_CPP11_HASH
154 #define HALF_ENABLE_CPP11_HASH 1
156 #ifndef HALF_ENABLE_CPP11_CFENV
157 #define HALF_ENABLE_CPP11_CFENV 1
160 #elif defined(__GLIBCXX__) // libstdc++
161 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103
163 #if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_TYPE_TRAITS)
164 #define HALF_ENABLE_CPP11_TYPE_TRAITS 1
166 #if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CSTDINT)
167 #define HALF_ENABLE_CPP11_CSTDINT 1
169 #if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CMATH)
170 #define HALF_ENABLE_CPP11_CMATH 1
172 #if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_HASH)
173 #define HALF_ENABLE_CPP11_HASH 1
175 #if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CFENV)
176 #define HALF_ENABLE_CPP11_CFENV 1
179 #if HALF_GCC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_TYPE_TRAITS)
180 #define HALF_ENABLE_CPP11_TYPE_TRAITS 1
182 #if HALF_GCC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CSTDINT)
183 #define HALF_ENABLE_CPP11_CSTDINT 1
185 #if HALF_GCC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CMATH)
186 #define HALF_ENABLE_CPP11_CMATH 1
188 #if HALF_GCC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_HASH)
189 #define HALF_ENABLE_CPP11_HASH 1
191 #if HALF_GCC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CFENV)
192 #define HALF_ENABLE_CPP11_CFENV 1
196 #elif defined(_CPPLIB_VER) // Dinkumware/Visual C++
197 #if _CPPLIB_VER >= 520 && !defined(HALF_ENABLE_CPP11_TYPE_TRAITS)
198 #define HALF_ENABLE_CPP11_TYPE_TRAITS 1
200 #if _CPPLIB_VER >= 520 && !defined(HALF_ENABLE_CPP11_CSTDINT)
201 #define HALF_ENABLE_CPP11_CSTDINT 1
203 #if _CPPLIB_VER >= 520 && !defined(HALF_ENABLE_CPP11_HASH)
204 #define HALF_ENABLE_CPP11_HASH 1
206 #if _CPPLIB_VER >= 610 && !defined(HALF_ENABLE_CPP11_CMATH)
207 #define HALF_ENABLE_CPP11_CMATH 1
209 #if _CPPLIB_VER >= 610 && !defined(HALF_ENABLE_CPP11_CFENV)
210 #define HALF_ENABLE_CPP11_CFENV 1
213 #undef HALF_GCC_VERSION
214 #undef HALF_ICC_VERSION
217 #if defined(HALF_ERRHANDLING_THROW_INVALID) || defined(HALF_ERRHANDLING_THROW_DIVBYZERO) || defined(HALF_ERRHANDLING_THROW_OVERFLOW) || defined(HALF_ERRHANDLING_THROW_UNDERFLOW) || defined(HALF_ERRHANDLING_THROW_INEXACT)
218 #define HALF_ERRHANDLING_THROWS 1
222 #define HALF_ERRHANDLING (HALF_ERRHANDLING_FLAGS||HALF_ERRHANDLING_ERRNO||HALF_ERRHANDLING_FENV||HALF_ERRHANDLING_THROWS)
225 #define HALF_UNUSED_NOERR(name) name
227 #define HALF_UNUSED_NOERR(name)
231 #if HALF_ENABLE_CPP11_CONSTEXPR
232 #define HALF_CONSTEXPR constexpr
233 #define HALF_CONSTEXPR_CONST constexpr
235 #define HALF_CONSTEXPR_NOERR
237 #define HALF_CONSTEXPR_NOERR constexpr
240 #define HALF_CONSTEXPR
241 #define HALF_CONSTEXPR_CONST const
242 #define HALF_CONSTEXPR_NOERR
246 #if HALF_ENABLE_CPP11_NOEXCEPT
247 #define HALF_NOEXCEPT noexcept
248 #define HALF_NOTHROW noexcept
250 #define HALF_NOEXCEPT
251 #define HALF_NOTHROW throw()
255 #if HALF_ENABLE_CPP11_THREAD_LOCAL
256 #define HALF_THREAD_LOCAL thread_local
258 #define HALF_THREAD_LOCAL static
271 #if HALF_ENABLE_CPP11_TYPE_TRAITS
272 #include <type_traits>
274 #if HALF_ENABLE_CPP11_CSTDINT
277 #if HALF_ERRHANDLING_ERRNO
280 #if HALF_ENABLE_CPP11_CFENV
283 #if HALF_ENABLE_CPP11_HASH
284 #include <functional>
288 #ifndef HALF_ENABLE_F16C_INTRINSICS
289 #define HALF_ENABLE_F16C_INTRINSICS __F16C__
297 #if HALF_ENABLE_F16C_INTRINSICS
298 #include <immintrin.h>
301 #ifdef HALF_DOXYGEN_ONLY
302 #define HALF_ARITHMETIC_TYPE (undefined)
312 #define HALF_ERRHANDLING_FLAGS 0
319 #define HALF_ERRHANDLING_ERRNO 0
327 #define HALF_ERRHANDLING_FENV 0
332 #define HALF_ERRHANDLING_THROW_INVALID (undefined)
337 #define HALF_ERRHANDLING_THROW_DIVBYZERO (undefined)
342 #define HALF_ERRHANDLING_THROW_OVERFLOW (undefined)
347 #define HALF_ERRHANDLING_THROW_UNDERFLOW (undefined)
352 #define HALF_ERRHANDLING_THROW_INEXACT (undefined)
355 #ifndef HALF_ERRHANDLING_OVERFLOW_TO_INEXACT
356 #define HALF_ERRHANDLING_OVERFLOW_TO_INEXACT 1
362 #ifndef HALF_ERRHANDLING_UNDERFLOW_TO_INEXACT
363 #define HALF_ERRHANDLING_UNDERFLOW_TO_INEXACT 1
390 #ifndef HALF_ROUND_STYLE
391 #define HALF_ROUND_STYLE 1 // = std::round_to_nearest
399 #define HUGE_VALH std::numeric_limits<half_float::half>::infinity()
406 #define FP_FAST_FMAH 1
413 #define HLF_ROUNDS HALF_ROUND_STYLE
416 #define FP_ILOGB0 INT_MIN
419 #define FP_ILOGBNAN INT_MAX
422 #define FP_SUBNORMAL 0
431 #define FP_INFINITE 3
437 #if !HALF_ENABLE_CPP11_CFENV && !defined(FE_ALL_EXCEPT)
438 #define FE_INVALID 0x10
439 #define FE_DIVBYZERO 0x08
440 #define FE_OVERFLOW 0x04
441 #define FE_UNDERFLOW 0x02
442 #define FE_INEXACT 0x01
443 #define FE_ALL_EXCEPT (FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW|FE_UNDERFLOW|FE_INEXACT)
453 #if HALF_ENABLE_CPP11_USER_LITERALS
462 half operator "" _h(
long double);
470 #if HALF_ENABLE_CPP11_TYPE_TRAITS
471 template<
bool B,
typename T,
typename F>
struct conditional : std::conditional<B,T,F> {};
475 template<
bool B>
struct bool_type : std::integral_constant<bool,B> {};
480 template<
typename T>
struct is_float : std::is_floating_point<T> {};
482 template<
bool,
typename T,
typename>
struct conditional {
typedef T
type; };
502 template<
typename T>
struct bits {
typedef unsigned char type; };
503 template<
typename T>
struct bits<const T> :
bits<T> {};
504 template<
typename T>
struct bits<volatile T> :
bits<T> {};
505 template<
typename T>
struct bits<const volatile T> :
bits<T> {};
507 #if HALF_ENABLE_CPP11_CSTDINT
508 typedef std::uint_least16_t
uint16;
512 typedef std::uint_fast32_t
uint32;
515 typedef std::int_fast32_t
int32;
518 template<>
struct bits<float> {
typedef std::uint_least32_t
type; };
521 template<>
struct bits<double> {
typedef std::uint_least64_t
type; };
523 typedef unsigned short uint16;
533 template<>
struct bits<float> :
conditional<std::numeric_limits<unsigned int>::digits>=32,unsigned int,unsigned long> {};
535 #if HALF_ENABLE_CPP11_LONG_LONG
536 template<>
struct bits<double> :
conditional<std::numeric_limits<unsigned long>::digits>=64,unsigned long,unsigned long long> {};
539 template<>
struct bits<double> {
typedef unsigned long type; };
544 #ifdef HALF_ARITHMETIC_TYPE
545 typedef HALF_ARITHMETIC_TYPE internal_t;
565 #if HALF_ENABLE_CPP11_CMATH
567 #elif defined(_MSC_VER)
568 return !::_finite(
static_cast<double>(arg)) && !::_isnan(
static_cast<double>(arg));
570 return arg == std::numeric_limits<T>::infinity() || arg == -std::numeric_limits<T>::infinity();
581 #if HALF_ENABLE_CPP11_CMATH
583 #elif defined(_MSC_VER)
584 return ::_isnan(
static_cast<double>(arg)) != 0;
597 #if HALF_ENABLE_CPP11_CMATH
600 return arg < T() || (arg == T() && T(1)/arg < T());
610 static const int N = std::numeric_limits<uint32>::digits - 1;
611 #if HALF_TWOS_COMPLEMENT_INT
612 return static_cast<int32>(arg) >> N;
614 return -((arg>>N)&1);
624 #if HALF_TWOS_COMPLEMENT_INT
625 return static_cast<int32>(arg) >> i;
627 return static_cast<int32>(arg)/(
static_cast<int32>(1)<<i) - ((arg>>(std::numeric_limits<uint32>::digits-1))&1);
647 #if HALF_ERRHANDLING_FLAGS
650 #if HALF_ERRHANDLING_ERRNO
656 #if HALF_ERRHANDLING_FENV && HALF_ENABLE_CPP11_CFENV
659 #ifdef HALF_ERRHANDLING_THROW_INVALID
661 throw std::domain_error(HALF_ERRHANDLING_THROW_INVALID);
663 #ifdef HALF_ERRHANDLING_THROW_DIVBYZERO
665 throw std::domain_error(HALF_ERRHANDLING_THROW_DIVBYZERO);
667 #ifdef HALF_ERRHANDLING_THROW_OVERFLOW
669 throw std::overflow_error(HALF_ERRHANDLING_THROW_OVERFLOW);
671 #ifdef HALF_ERRHANDLING_THROW_UNDERFLOW
673 throw std::underflow_error(HALF_ERRHANDLING_THROW_UNDERFLOW);
675 #ifdef HALF_ERRHANDLING_THROW_INEXACT
677 throw std::range_error(HALF_ERRHANDLING_THROW_INEXACT);
679 #if HALF_ERRHANDLING_UNDERFLOW_TO_INEXACT
683 #if HALF_ERRHANDLING_OVERFLOW_TO_INEXACT
699 raise(
FE_INVALID, (x&0x7FFF)>0x7C00 || (y&0x7FFF)>0x7C00);
701 return (x&0x7FFF) > 0x7C00 || (y&0x7FFF) > 0x7C00;
724 raise(
FE_INVALID, ((x&0x7FFF)>0x7C00 && !(x&0x200)) || ((y&0x7FFF)>0x7C00 && !(y&0x200)));
726 return ((x&0x7FFF)>0x7C00) ? (x|0x200) : (y|0x200);
738 raise(
FE_INVALID, ((x&0x7FFF)>0x7C00 && !(x&0x200)) || ((y&0x7FFF)>0x7C00 && !(y&0x200)) || ((z&0x7FFF)>0x7C00 && !(z&0x200)));
740 return ((x&0x7FFF)>0x7C00) ? (x|0x200) : ((y&0x7FFF)>0x7C00) ? (y|0x200) : (z|0x200);
751 return (((y&0x7FFF)>0x7C00) && !(y&0x200)) ?
signal(y) : x;
777 return sign | 0x7C00;
786 #if HALF_ERRHANDLING && !HALF_ERRHANDLING_UNDERFLOW_TO_INEXACT
806 return (R==std::round_toward_infinity) ? (sign+0x7C00-(sign>>15)) :
807 (R==std::round_toward_neg_infinity) ? (sign+0x7BFF+(sign>>15)) :
808 (R==std::round_toward_zero) ? (sign|0x7BFF) :
822 return (R==std::round_toward_infinity) ? (sign+1-(sign>>15)) :
823 (R==std::round_toward_neg_infinity) ? (sign+(sign>>15)) :
840 value += (R==std::round_to_nearest) ? (g&(s|value)) :
841 (R==std::round_toward_infinity) ? (~(value>>15)&(g|s)) :
842 (R==std::round_toward_neg_infinity) ? ((value>>15)&(g|s)) : 0;
843 if((value&0x7C00) == 0x7C00)
845 else if(value & 0x7C00)
851 return (R==std::round_to_nearest) ? (value+(g&(s|value))) :
852 (R==std::round_toward_infinity) ? (value+(~(value>>15)&(g|s))) :
853 (R==std::round_toward_neg_infinity) ? (value+((value>>15)&(g|s))) :
866 template<std::
float_round_style R,
bool E,
bool I>
unsigned int integral(
unsigned int value)
868 unsigned int abs = value & 0x7FFF;
872 return ((R==std::round_to_nearest) ? (0x3C00&-
static_cast<unsigned>(
abs>=(0x3800+E))) :
873 (R==std::round_toward_infinity) ? (0x3C00&-(~(value>>15)&(
abs!=0))) :
874 (R==std::round_toward_neg_infinity) ? (0x3C00&-
static_cast<unsigned>(value>0x8000)) :
878 return (
abs>0x7C00) ?
signal(value) : value;
879 unsigned int exp = 25 - (
abs>>10), mask = (1<<
exp) - 1;
881 return (( (R==std::round_to_nearest) ? ((1<<(
exp-1))-(~(value>>
exp)&E)) :
882 (R==std::round_toward_infinity) ? (mask&((value>>15)-1)) :
883 (R==std::round_toward_neg_infinity) ? (mask&-(value>>15)) :
901 template<std::
float_round_style R,
unsigned int F,
bool S,
bool N,
bool I>
unsigned int fixed2half(
uint32 m,
int exp = 14,
unsigned int sign = 0,
int s = 0)
906 m = (m^msign) - msign;
907 sign = msign & 0x8000;
910 for(; m<(static_cast<uint32>(1)<<F) &&
exp; m<<=1,--
exp) ;
912 return rounded<R,I>(sign+(m>>(F-10-
exp)), (m>>(F-11-
exp))&1, s|((m&((
static_cast<uint32>(1)<<(F-11-
exp))-1))!=0));
913 return rounded<R,I>(sign+(
exp<<10)+(m>>(F-10)), (m>>(F-11))&1, s|((m&((
static_cast<uint32>(1)<<(F-11))-1))!=0));
926 #if HALF_ENABLE_F16C_INTRINSICS
927 return _mm_cvtsi128_si32(_mm_cvtps_ph(_mm_set_ss(value),
928 (R==std::round_to_nearest) ? _MM_FROUND_TO_NEAREST_INT :
929 (R==std::round_toward_zero) ? _MM_FROUND_TO_ZERO :
930 (R==std::round_toward_infinity) ? _MM_FROUND_TO_POS_INF :
931 (R==std::round_toward_neg_infinity) ? _MM_FROUND_TO_NEG_INF :
932 _MM_FROUND_CUR_DIRECTION));
935 std::memcpy(&fbits, &value,
sizeof(
float));
937 unsigned int sign = (fbits>>16) & 0x8000;
939 if(fbits >= 0x7F800000)
940 return sign | 0x7C00 | ((fbits>0x7F800000) ? (0x200|((fbits>>13)&0x3FF)) : 0);
941 if(fbits >= 0x47800000)
942 return overflow<R>(sign);
943 if(fbits >= 0x38800000)
944 return rounded<R,false>(sign|(((fbits>>23)-112)<<10)|((fbits>>13)&0x3FF), (fbits>>12)&1, (fbits&0xFFF)!=0);
945 if(fbits >= 0x33000000)
947 int i = 125 - (fbits>>23);
948 fbits = (fbits&0x7FFFFF) | 0x800000;
949 return rounded<R,false>(sign|(fbits>>(i+1)), (fbits>>i)&1, (fbits&((
static_cast<uint32>(1)<<i)-1))!=0);
952 return underflow<R>(sign);
955 static const uint16 base_table[512] = {
956 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
957 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
958 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
959 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
960 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
961 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
962 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100,
963 0x0200, 0x0400, 0x0800, 0x0C00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x2400, 0x2800, 0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00,
964 0x4000, 0x4400, 0x4800, 0x4C00, 0x5000, 0x5400, 0x5800, 0x5C00, 0x6000, 0x6400, 0x6800, 0x6C00, 0x7000, 0x7400, 0x7800, 0x7BFF,
965 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF,
966 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF,
967 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF,
968 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF,
969 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF,
970 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF,
971 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7BFF, 0x7C00,
972 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
973 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
974 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
975 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
976 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
977 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
978 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001, 0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100,
979 0x8200, 0x8400, 0x8800, 0x8C00, 0x9000, 0x9400, 0x9800, 0x9C00, 0xA000, 0xA400, 0xA800, 0xAC00, 0xB000, 0xB400, 0xB800, 0xBC00,
980 0xC000, 0xC400, 0xC800, 0xCC00, 0xD000, 0xD400, 0xD800, 0xDC00, 0xE000, 0xE400, 0xE800, 0xEC00, 0xF000, 0xF400, 0xF800, 0xFBFF,
981 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF,
982 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF,
983 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF,
984 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF,
985 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF,
986 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF,
987 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFBFF, 0xFC00 };
988 static const unsigned char shift_table[256] = {
989 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
990 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
991 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
992 25, 25, 25, 25, 25, 25, 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,
993 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,
994 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
995 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
996 24, 24, 24, 24, 24, 24, 24, 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 };
997 int sexp = fbits >> 23,
exp = sexp & 0xFF, i = shift_table[
exp];
1000 return rounded<R,false>(base_table[sexp]+(fbits>>i), (m>>(i-1))&1, (((
static_cast<uint32>(1)<<(i-1))-1)&m)!=0);
1014 #if HALF_ENABLE_F16C_INTRINSICS
1015 if(R == std::round_indeterminate)
1016 return _mm_cvtsi128_si32(_mm_cvtps_ph(_mm_cvtpd_ps(_mm_set_sd(value)), _MM_FROUND_CUR_DIRECTION));
1019 std::memcpy(&dbits, &value,
sizeof(
double));
1020 uint32 hi = dbits >> 32, lo = dbits & 0xFFFFFFFF;
1021 unsigned int sign = (hi>>16) & 0x8000;
1023 if(hi >= 0x7FF00000)
1024 return sign | 0x7C00 | ((dbits&0xFFFFFFFFFFFFF) ? (0x200|((hi>>10)&0x3FF)) : 0);
1025 if(hi >= 0x40F00000)
1026 return overflow<R>(sign);
1027 if(hi >= 0x3F100000)
1028 return rounded<R,false>(sign|(((hi>>20)-1008)<<10)|((hi>>10)&0x3FF), (hi>>9)&1, ((hi&0x1FF)|lo)!=0);
1029 if(hi >= 0x3E600000)
1031 int i = 1018 - (hi>>20);
1032 hi = (hi&0xFFFFF) | 0x100000;
1033 return rounded<R,false>(sign|(hi>>(i+1)), (hi>>i)&1, ((hi&((
static_cast<uint32>(1)<<i)-1))|lo)!=0);
1036 return underflow<R>(sign);
1050 unsigned int hbits =
static_cast<unsigned>(
builtin_signbit(value)) << 15;
1054 return hbits | 0x7FFF;
1056 return hbits | 0x7C00;
1060 return overflow<R>(hbits);
1066 hbits |= ((
exp+13)<<10);
1069 int m =
std::abs(
static_cast<int>(ival));
1070 return rounded<R,false>(hbits+(m>>1), m&1, frac!=T());
1081 template<std::
float_round_style R,
typename T>
unsigned int float2half(T value)
1083 return float2half_impl<R>(value,
bool_type<std::numeric_limits<T>::is_iec559&&
sizeof(
typename bits<T>::type)==
sizeof(T)>());
1093 template<std::
float_round_style R,
typename T>
unsigned int int2half(T value)
1095 unsigned int bits =
static_cast<unsigned>(value<0) << 15;
1101 return overflow<R>(
bits);
1102 unsigned int m =
static_cast<unsigned int>(value),
exp = 24;
1103 for(; m<0x400; m<<=1,--
exp) ;
1104 for(; m>0x7FF; m>>=1,++
exp) ;
1106 return (
exp>24) ? rounded<R,false>(
bits, (value>>(
exp-25))&1, (((1<<(
exp-25))-1)&value)!=0) :
bits;
1115 #if HALF_ENABLE_F16C_INTRINSICS
1116 return _mm_cvtss_f32(_mm_cvtph_ps(_mm_cvtsi32_si128(value)));
1120 int abs = value & 0x7FFF;
1123 fbits |= 0x38000000 <<
static_cast<unsigned>(
abs>=0x7C00);
1124 for(;
abs<0x400;
abs<<=1,fbits-=0x800000) ;
1129 0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34A00000, 0x34C00000, 0x34E00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000, 0x35400000, 0x35500000, 0x35600000, 0x35700000,
1130 0x35800000, 0x35880000, 0x35900000, 0x35980000, 0x35A00000, 0x35A80000, 0x35B00000, 0x35B80000, 0x35C00000, 0x35C80000, 0x35D00000, 0x35D80000, 0x35E00000, 0x35E80000, 0x35F00000, 0x35F80000,
1131 0x36000000, 0x36040000, 0x36080000, 0x360C0000, 0x36100000, 0x36140000, 0x36180000, 0x361C0000, 0x36200000, 0x36240000, 0x36280000, 0x362C0000, 0x36300000, 0x36340000, 0x36380000, 0x363C0000,
1132 0x36400000, 0x36440000, 0x36480000, 0x364C0000, 0x36500000, 0x36540000, 0x36580000, 0x365C0000, 0x36600000, 0x36640000, 0x36680000, 0x366C0000, 0x36700000, 0x36740000, 0x36780000, 0x367C0000,
1133 0x36800000, 0x36820000, 0x36840000, 0x36860000, 0x36880000, 0x368A0000, 0x368C0000, 0x368E0000, 0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369A0000, 0x369C0000, 0x369E0000,
1134 0x36A00000, 0x36A20000, 0x36A40000, 0x36A60000, 0x36A80000, 0x36AA0000, 0x36AC0000, 0x36AE0000, 0x36B00000, 0x36B20000, 0x36B40000, 0x36B60000, 0x36B80000, 0x36BA0000, 0x36BC0000, 0x36BE0000,
1135 0x36C00000, 0x36C20000, 0x36C40000, 0x36C60000, 0x36C80000, 0x36CA0000, 0x36CC0000, 0x36CE0000, 0x36D00000, 0x36D20000, 0x36D40000, 0x36D60000, 0x36D80000, 0x36DA0000, 0x36DC0000, 0x36DE0000,
1136 0x36E00000, 0x36E20000, 0x36E40000, 0x36E60000, 0x36E80000, 0x36EA0000, 0x36EC0000, 0x36EE0000, 0x36F00000, 0x36F20000, 0x36F40000, 0x36F60000, 0x36F80000, 0x36FA0000, 0x36FC0000, 0x36FE0000,
1137 0x37000000, 0x37010000, 0x37020000, 0x37030000, 0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000, 0x370A0000, 0x370B0000, 0x370C0000, 0x370D0000, 0x370E0000, 0x370F0000,
1138 0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000, 0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371A0000, 0x371B0000, 0x371C0000, 0x371D0000, 0x371E0000, 0x371F0000,
1139 0x37200000, 0x37210000, 0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000, 0x37280000, 0x37290000, 0x372A0000, 0x372B0000, 0x372C0000, 0x372D0000, 0x372E0000, 0x372F0000,
1140 0x37300000, 0x37310000, 0x37320000, 0x37330000, 0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000, 0x373A0000, 0x373B0000, 0x373C0000, 0x373D0000, 0x373E0000, 0x373F0000,
1141 0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000, 0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374A0000, 0x374B0000, 0x374C0000, 0x374D0000, 0x374E0000, 0x374F0000,
1142 0x37500000, 0x37510000, 0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000, 0x37580000, 0x37590000, 0x375A0000, 0x375B0000, 0x375C0000, 0x375D0000, 0x375E0000, 0x375F0000,
1143 0x37600000, 0x37610000, 0x37620000, 0x37630000, 0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000, 0x376A0000, 0x376B0000, 0x376C0000, 0x376D0000, 0x376E0000, 0x376F0000,
1144 0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000, 0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377A0000, 0x377B0000, 0x377C0000, 0x377D0000, 0x377E0000, 0x377F0000,
1145 0x37800000, 0x37808000, 0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000, 0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000, 0x37870000, 0x37878000,
1146 0x37880000, 0x37888000, 0x37890000, 0x37898000, 0x378A0000, 0x378A8000, 0x378B0000, 0x378B8000, 0x378C0000, 0x378C8000, 0x378D0000, 0x378D8000, 0x378E0000, 0x378E8000, 0x378F0000, 0x378F8000,
1147 0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000, 0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000, 0x37960000, 0x37968000, 0x37970000, 0x37978000,
1148 0x37980000, 0x37988000, 0x37990000, 0x37998000, 0x379A0000, 0x379A8000, 0x379B0000, 0x379B8000, 0x379C0000, 0x379C8000, 0x379D0000, 0x379D8000, 0x379E0000, 0x379E8000, 0x379F0000, 0x379F8000,
1149 0x37A00000, 0x37A08000, 0x37A10000, 0x37A18000, 0x37A20000, 0x37A28000, 0x37A30000, 0x37A38000, 0x37A40000, 0x37A48000, 0x37A50000, 0x37A58000, 0x37A60000, 0x37A68000, 0x37A70000, 0x37A78000,
1150 0x37A80000, 0x37A88000, 0x37A90000, 0x37A98000, 0x37AA0000, 0x37AA8000, 0x37AB0000, 0x37AB8000, 0x37AC0000, 0x37AC8000, 0x37AD0000, 0x37AD8000, 0x37AE0000, 0x37AE8000, 0x37AF0000, 0x37AF8000,
1151 0x37B00000, 0x37B08000, 0x37B10000, 0x37B18000, 0x37B20000, 0x37B28000, 0x37B30000, 0x37B38000, 0x37B40000, 0x37B48000, 0x37B50000, 0x37B58000, 0x37B60000, 0x37B68000, 0x37B70000, 0x37B78000,
1152 0x37B80000, 0x37B88000, 0x37B90000, 0x37B98000, 0x37BA0000, 0x37BA8000, 0x37BB0000, 0x37BB8000, 0x37BC0000, 0x37BC8000, 0x37BD0000, 0x37BD8000, 0x37BE0000, 0x37BE8000, 0x37BF0000, 0x37BF8000,
1153 0x37C00000, 0x37C08000, 0x37C10000, 0x37C18000, 0x37C20000, 0x37C28000, 0x37C30000, 0x37C38000, 0x37C40000, 0x37C48000, 0x37C50000, 0x37C58000, 0x37C60000, 0x37C68000, 0x37C70000, 0x37C78000,
1154 0x37C80000, 0x37C88000, 0x37C90000, 0x37C98000, 0x37CA0000, 0x37CA8000, 0x37CB0000, 0x37CB8000, 0x37CC0000, 0x37CC8000, 0x37CD0000, 0x37CD8000, 0x37CE0000, 0x37CE8000, 0x37CF0000, 0x37CF8000,
1155 0x37D00000, 0x37D08000, 0x37D10000, 0x37D18000, 0x37D20000, 0x37D28000, 0x37D30000, 0x37D38000, 0x37D40000, 0x37D48000, 0x37D50000, 0x37D58000, 0x37D60000, 0x37D68000, 0x37D70000, 0x37D78000,
1156 0x37D80000, 0x37D88000, 0x37D90000, 0x37D98000, 0x37DA0000, 0x37DA8000, 0x37DB0000, 0x37DB8000, 0x37DC0000, 0x37DC8000, 0x37DD0000, 0x37DD8000, 0x37DE0000, 0x37DE8000, 0x37DF0000, 0x37DF8000,
1157 0x37E00000, 0x37E08000, 0x37E10000, 0x37E18000, 0x37E20000, 0x37E28000, 0x37E30000, 0x37E38000, 0x37E40000, 0x37E48000, 0x37E50000, 0x37E58000, 0x37E60000, 0x37E68000, 0x37E70000, 0x37E78000,
1158 0x37E80000, 0x37E88000, 0x37E90000, 0x37E98000, 0x37EA0000, 0x37EA8000, 0x37EB0000, 0x37EB8000, 0x37EC0000, 0x37EC8000, 0x37ED0000, 0x37ED8000, 0x37EE0000, 0x37EE8000, 0x37EF0000, 0x37EF8000,
1159 0x37F00000, 0x37F08000, 0x37F10000, 0x37F18000, 0x37F20000, 0x37F28000, 0x37F30000, 0x37F38000, 0x37F40000, 0x37F48000, 0x37F50000, 0x37F58000, 0x37F60000, 0x37F68000, 0x37F70000, 0x37F78000,
1160 0x37F80000, 0x37F88000, 0x37F90000, 0x37F98000, 0x37FA0000, 0x37FA8000, 0x37FB0000, 0x37FB8000, 0x37FC0000, 0x37FC8000, 0x37FD0000, 0x37FD8000, 0x37FE0000, 0x37FE8000, 0x37FF0000, 0x37FF8000,
1161 0x38000000, 0x38004000, 0x38008000, 0x3800C000, 0x38010000, 0x38014000, 0x38018000, 0x3801C000, 0x38020000, 0x38024000, 0x38028000, 0x3802C000, 0x38030000, 0x38034000, 0x38038000, 0x3803C000,
1162 0x38040000, 0x38044000, 0x38048000, 0x3804C000, 0x38050000, 0x38054000, 0x38058000, 0x3805C000, 0x38060000, 0x38064000, 0x38068000, 0x3806C000, 0x38070000, 0x38074000, 0x38078000, 0x3807C000,
1163 0x38080000, 0x38084000, 0x38088000, 0x3808C000, 0x38090000, 0x38094000, 0x38098000, 0x3809C000, 0x380A0000, 0x380A4000, 0x380A8000, 0x380AC000, 0x380B0000, 0x380B4000, 0x380B8000, 0x380BC000,
1164 0x380C0000, 0x380C4000, 0x380C8000, 0x380CC000, 0x380D0000, 0x380D4000, 0x380D8000, 0x380DC000, 0x380E0000, 0x380E4000, 0x380E8000, 0x380EC000, 0x380F0000, 0x380F4000, 0x380F8000, 0x380FC000,
1165 0x38100000, 0x38104000, 0x38108000, 0x3810C000, 0x38110000, 0x38114000, 0x38118000, 0x3811C000, 0x38120000, 0x38124000, 0x38128000, 0x3812C000, 0x38130000, 0x38134000, 0x38138000, 0x3813C000,
1166 0x38140000, 0x38144000, 0x38148000, 0x3814C000, 0x38150000, 0x38154000, 0x38158000, 0x3815C000, 0x38160000, 0x38164000, 0x38168000, 0x3816C000, 0x38170000, 0x38174000, 0x38178000, 0x3817C000,
1167 0x38180000, 0x38184000, 0x38188000, 0x3818C000, 0x38190000, 0x38194000, 0x38198000, 0x3819C000, 0x381A0000, 0x381A4000, 0x381A8000, 0x381AC000, 0x381B0000, 0x381B4000, 0x381B8000, 0x381BC000,
1168 0x381C0000, 0x381C4000, 0x381C8000, 0x381CC000, 0x381D0000, 0x381D4000, 0x381D8000, 0x381DC000, 0x381E0000, 0x381E4000, 0x381E8000, 0x381EC000, 0x381F0000, 0x381F4000, 0x381F8000, 0x381FC000,
1169 0x38200000, 0x38204000, 0x38208000, 0x3820C000, 0x38210000, 0x38214000, 0x38218000, 0x3821C000, 0x38220000, 0x38224000, 0x38228000, 0x3822C000, 0x38230000, 0x38234000, 0x38238000, 0x3823C000,
1170 0x38240000, 0x38244000, 0x38248000, 0x3824C000, 0x38250000, 0x38254000, 0x38258000, 0x3825C000, 0x38260000, 0x38264000, 0x38268000, 0x3826C000, 0x38270000, 0x38274000, 0x38278000, 0x3827C000,
1171 0x38280000, 0x38284000, 0x38288000, 0x3828C000, 0x38290000, 0x38294000, 0x38298000, 0x3829C000, 0x382A0000, 0x382A4000, 0x382A8000, 0x382AC000, 0x382B0000, 0x382B4000, 0x382B8000, 0x382BC000,
1172 0x382C0000, 0x382C4000, 0x382C8000, 0x382CC000, 0x382D0000, 0x382D4000, 0x382D8000, 0x382DC000, 0x382E0000, 0x382E4000, 0x382E8000, 0x382EC000, 0x382F0000, 0x382F4000, 0x382F8000, 0x382FC000,
1173 0x38300000, 0x38304000, 0x38308000, 0x3830C000, 0x38310000, 0x38314000, 0x38318000, 0x3831C000, 0x38320000, 0x38324000, 0x38328000, 0x3832C000, 0x38330000, 0x38334000, 0x38338000, 0x3833C000,
1174 0x38340000, 0x38344000, 0x38348000, 0x3834C000, 0x38350000, 0x38354000, 0x38358000, 0x3835C000, 0x38360000, 0x38364000, 0x38368000, 0x3836C000, 0x38370000, 0x38374000, 0x38378000, 0x3837C000,
1175 0x38380000, 0x38384000, 0x38388000, 0x3838C000, 0x38390000, 0x38394000, 0x38398000, 0x3839C000, 0x383A0000, 0x383A4000, 0x383A8000, 0x383AC000, 0x383B0000, 0x383B4000, 0x383B8000, 0x383BC000,
1176 0x383C0000, 0x383C4000, 0x383C8000, 0x383CC000, 0x383D0000, 0x383D4000, 0x383D8000, 0x383DC000, 0x383E0000, 0x383E4000, 0x383E8000, 0x383EC000, 0x383F0000, 0x383F4000, 0x383F8000, 0x383FC000,
1177 0x38400000, 0x38404000, 0x38408000, 0x3840C000, 0x38410000, 0x38414000, 0x38418000, 0x3841C000, 0x38420000, 0x38424000, 0x38428000, 0x3842C000, 0x38430000, 0x38434000, 0x38438000, 0x3843C000,
1178 0x38440000, 0x38444000, 0x38448000, 0x3844C000, 0x38450000, 0x38454000, 0x38458000, 0x3845C000, 0x38460000, 0x38464000, 0x38468000, 0x3846C000, 0x38470000, 0x38474000, 0x38478000, 0x3847C000,
1179 0x38480000, 0x38484000, 0x38488000, 0x3848C000, 0x38490000, 0x38494000, 0x38498000, 0x3849C000, 0x384A0000, 0x384A4000, 0x384A8000, 0x384AC000, 0x384B0000, 0x384B4000, 0x384B8000, 0x384BC000,
1180 0x384C0000, 0x384C4000, 0x384C8000, 0x384CC000, 0x384D0000, 0x384D4000, 0x384D8000, 0x384DC000, 0x384E0000, 0x384E4000, 0x384E8000, 0x384EC000, 0x384F0000, 0x384F4000, 0x384F8000, 0x384FC000,
1181 0x38500000, 0x38504000, 0x38508000, 0x3850C000, 0x38510000, 0x38514000, 0x38518000, 0x3851C000, 0x38520000, 0x38524000, 0x38528000, 0x3852C000, 0x38530000, 0x38534000, 0x38538000, 0x3853C000,
1182 0x38540000, 0x38544000, 0x38548000, 0x3854C000, 0x38550000, 0x38554000, 0x38558000, 0x3855C000, 0x38560000, 0x38564000, 0x38568000, 0x3856C000, 0x38570000, 0x38574000, 0x38578000, 0x3857C000,
1183 0x38580000, 0x38584000, 0x38588000, 0x3858C000, 0x38590000, 0x38594000, 0x38598000, 0x3859C000, 0x385A0000, 0x385A4000, 0x385A8000, 0x385AC000, 0x385B0000, 0x385B4000, 0x385B8000, 0x385BC000,
1184 0x385C0000, 0x385C4000, 0x385C8000, 0x385CC000, 0x385D0000, 0x385D4000, 0x385D8000, 0x385DC000, 0x385E0000, 0x385E4000, 0x385E8000, 0x385EC000, 0x385F0000, 0x385F4000, 0x385F8000, 0x385FC000,
1185 0x38600000, 0x38604000, 0x38608000, 0x3860C000, 0x38610000, 0x38614000, 0x38618000, 0x3861C000, 0x38620000, 0x38624000, 0x38628000, 0x3862C000, 0x38630000, 0x38634000, 0x38638000, 0x3863C000,
1186 0x38640000, 0x38644000, 0x38648000, 0x3864C000, 0x38650000, 0x38654000, 0x38658000, 0x3865C000, 0x38660000, 0x38664000, 0x38668000, 0x3866C000, 0x38670000, 0x38674000, 0x38678000, 0x3867C000,
1187 0x38680000, 0x38684000, 0x38688000, 0x3868C000, 0x38690000, 0x38694000, 0x38698000, 0x3869C000, 0x386A0000, 0x386A4000, 0x386A8000, 0x386AC000, 0x386B0000, 0x386B4000, 0x386B8000, 0x386BC000,
1188 0x386C0000, 0x386C4000, 0x386C8000, 0x386CC000, 0x386D0000, 0x386D4000, 0x386D8000, 0x386DC000, 0x386E0000, 0x386E4000, 0x386E8000, 0x386EC000, 0x386F0000, 0x386F4000, 0x386F8000, 0x386FC000,
1189 0x38700000, 0x38704000, 0x38708000, 0x3870C000, 0x38710000, 0x38714000, 0x38718000, 0x3871C000, 0x38720000, 0x38724000, 0x38728000, 0x3872C000, 0x38730000, 0x38734000, 0x38738000, 0x3873C000,
1190 0x38740000, 0x38744000, 0x38748000, 0x3874C000, 0x38750000, 0x38754000, 0x38758000, 0x3875C000, 0x38760000, 0x38764000, 0x38768000, 0x3876C000, 0x38770000, 0x38774000, 0x38778000, 0x3877C000,
1191 0x38780000, 0x38784000, 0x38788000, 0x3878C000, 0x38790000, 0x38794000, 0x38798000, 0x3879C000, 0x387A0000, 0x387A4000, 0x387A8000, 0x387AC000, 0x387B0000, 0x387B4000, 0x387B8000, 0x387BC000,
1192 0x387C0000, 0x387C4000, 0x387C8000, 0x387CC000, 0x387D0000, 0x387D4000, 0x387D8000, 0x387DC000, 0x387E0000, 0x387E4000, 0x387E8000, 0x387EC000, 0x387F0000, 0x387F4000, 0x387F8000, 0x387FC000,
1193 0x38000000, 0x38002000, 0x38004000, 0x38006000, 0x38008000, 0x3800A000, 0x3800C000, 0x3800E000, 0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801A000, 0x3801C000, 0x3801E000,
1194 0x38020000, 0x38022000, 0x38024000, 0x38026000, 0x38028000, 0x3802A000, 0x3802C000, 0x3802E000, 0x38030000, 0x38032000, 0x38034000, 0x38036000, 0x38038000, 0x3803A000, 0x3803C000, 0x3803E000,
1195 0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804A000, 0x3804C000, 0x3804E000, 0x38050000, 0x38052000, 0x38054000, 0x38056000, 0x38058000, 0x3805A000, 0x3805C000, 0x3805E000,
1196 0x38060000, 0x38062000, 0x38064000, 0x38066000, 0x38068000, 0x3806A000, 0x3806C000, 0x3806E000, 0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807A000, 0x3807C000, 0x3807E000,
1197 0x38080000, 0x38082000, 0x38084000, 0x38086000, 0x38088000, 0x3808A000, 0x3808C000, 0x3808E000, 0x38090000, 0x38092000, 0x38094000, 0x38096000, 0x38098000, 0x3809A000, 0x3809C000, 0x3809E000,
1198 0x380A0000, 0x380A2000, 0x380A4000, 0x380A6000, 0x380A8000, 0x380AA000, 0x380AC000, 0x380AE000, 0x380B0000, 0x380B2000, 0x380B4000, 0x380B6000, 0x380B8000, 0x380BA000, 0x380BC000, 0x380BE000,
1199 0x380C0000, 0x380C2000, 0x380C4000, 0x380C6000, 0x380C8000, 0x380CA000, 0x380CC000, 0x380CE000, 0x380D0000, 0x380D2000, 0x380D4000, 0x380D6000, 0x380D8000, 0x380DA000, 0x380DC000, 0x380DE000,
1200 0x380E0000, 0x380E2000, 0x380E4000, 0x380E6000, 0x380E8000, 0x380EA000, 0x380EC000, 0x380EE000, 0x380F0000, 0x380F2000, 0x380F4000, 0x380F6000, 0x380F8000, 0x380FA000, 0x380FC000, 0x380FE000,
1201 0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810A000, 0x3810C000, 0x3810E000, 0x38110000, 0x38112000, 0x38114000, 0x38116000, 0x38118000, 0x3811A000, 0x3811C000, 0x3811E000,
1202 0x38120000, 0x38122000, 0x38124000, 0x38126000, 0x38128000, 0x3812A000, 0x3812C000, 0x3812E000, 0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813A000, 0x3813C000, 0x3813E000,
1203 0x38140000, 0x38142000, 0x38144000, 0x38146000, 0x38148000, 0x3814A000, 0x3814C000, 0x3814E000, 0x38150000, 0x38152000, 0x38154000, 0x38156000, 0x38158000, 0x3815A000, 0x3815C000, 0x3815E000,
1204 0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816A000, 0x3816C000, 0x3816E000, 0x38170000, 0x38172000, 0x38174000, 0x38176000, 0x38178000, 0x3817A000, 0x3817C000, 0x3817E000,
1205 0x38180000, 0x38182000, 0x38184000, 0x38186000, 0x38188000, 0x3818A000, 0x3818C000, 0x3818E000, 0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819A000, 0x3819C000, 0x3819E000,
1206 0x381A0000, 0x381A2000, 0x381A4000, 0x381A6000, 0x381A8000, 0x381AA000, 0x381AC000, 0x381AE000, 0x381B0000, 0x381B2000, 0x381B4000, 0x381B6000, 0x381B8000, 0x381BA000, 0x381BC000, 0x381BE000,
1207 0x381C0000, 0x381C2000, 0x381C4000, 0x381C6000, 0x381C8000, 0x381CA000, 0x381CC000, 0x381CE000, 0x381D0000, 0x381D2000, 0x381D4000, 0x381D6000, 0x381D8000, 0x381DA000, 0x381DC000, 0x381DE000,
1208 0x381E0000, 0x381E2000, 0x381E4000, 0x381E6000, 0x381E8000, 0x381EA000, 0x381EC000, 0x381EE000, 0x381F0000, 0x381F2000, 0x381F4000, 0x381F6000, 0x381F8000, 0x381FA000, 0x381FC000, 0x381FE000,
1209 0x38200000, 0x38202000, 0x38204000, 0x38206000, 0x38208000, 0x3820A000, 0x3820C000, 0x3820E000, 0x38210000, 0x38212000, 0x38214000, 0x38216000, 0x38218000, 0x3821A000, 0x3821C000, 0x3821E000,
1210 0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822A000, 0x3822C000, 0x3822E000, 0x38230000, 0x38232000, 0x38234000, 0x38236000, 0x38238000, 0x3823A000, 0x3823C000, 0x3823E000,
1211 0x38240000, 0x38242000, 0x38244000, 0x38246000, 0x38248000, 0x3824A000, 0x3824C000, 0x3824E000, 0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825A000, 0x3825C000, 0x3825E000,
1212 0x38260000, 0x38262000, 0x38264000, 0x38266000, 0x38268000, 0x3826A000, 0x3826C000, 0x3826E000, 0x38270000, 0x38272000, 0x38274000, 0x38276000, 0x38278000, 0x3827A000, 0x3827C000, 0x3827E000,
1213 0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828A000, 0x3828C000, 0x3828E000, 0x38290000, 0x38292000, 0x38294000, 0x38296000, 0x38298000, 0x3829A000, 0x3829C000, 0x3829E000,
1214 0x382A0000, 0x382A2000, 0x382A4000, 0x382A6000, 0x382A8000, 0x382AA000, 0x382AC000, 0x382AE000, 0x382B0000, 0x382B2000, 0x382B4000, 0x382B6000, 0x382B8000, 0x382BA000, 0x382BC000, 0x382BE000,
1215 0x382C0000, 0x382C2000, 0x382C4000, 0x382C6000, 0x382C8000, 0x382CA000, 0x382CC000, 0x382CE000, 0x382D0000, 0x382D2000, 0x382D4000, 0x382D6000, 0x382D8000, 0x382DA000, 0x382DC000, 0x382DE000,
1216 0x382E0000, 0x382E2000, 0x382E4000, 0x382E6000, 0x382E8000, 0x382EA000, 0x382EC000, 0x382EE000, 0x382F0000, 0x382F2000, 0x382F4000, 0x382F6000, 0x382F8000, 0x382FA000, 0x382FC000, 0x382FE000,
1217 0x38300000, 0x38302000, 0x38304000, 0x38306000, 0x38308000, 0x3830A000, 0x3830C000, 0x3830E000, 0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831A000, 0x3831C000, 0x3831E000,
1218 0x38320000, 0x38322000, 0x38324000, 0x38326000, 0x38328000, 0x3832A000, 0x3832C000, 0x3832E000, 0x38330000, 0x38332000, 0x38334000, 0x38336000, 0x38338000, 0x3833A000, 0x3833C000, 0x3833E000,
1219 0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834A000, 0x3834C000, 0x3834E000, 0x38350000, 0x38352000, 0x38354000, 0x38356000, 0x38358000, 0x3835A000, 0x3835C000, 0x3835E000,
1220 0x38360000, 0x38362000, 0x38364000, 0x38366000, 0x38368000, 0x3836A000, 0x3836C000, 0x3836E000, 0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837A000, 0x3837C000, 0x3837E000,
1221 0x38380000, 0x38382000, 0x38384000, 0x38386000, 0x38388000, 0x3838A000, 0x3838C000, 0x3838E000, 0x38390000, 0x38392000, 0x38394000, 0x38396000, 0x38398000, 0x3839A000, 0x3839C000, 0x3839E000,
1222 0x383A0000, 0x383A2000, 0x383A4000, 0x383A6000, 0x383A8000, 0x383AA000, 0x383AC000, 0x383AE000, 0x383B0000, 0x383B2000, 0x383B4000, 0x383B6000, 0x383B8000, 0x383BA000, 0x383BC000, 0x383BE000,
1223 0x383C0000, 0x383C2000, 0x383C4000, 0x383C6000, 0x383C8000, 0x383CA000, 0x383CC000, 0x383CE000, 0x383D0000, 0x383D2000, 0x383D4000, 0x383D6000, 0x383D8000, 0x383DA000, 0x383DC000, 0x383DE000,
1224 0x383E0000, 0x383E2000, 0x383E4000, 0x383E6000, 0x383E8000, 0x383EA000, 0x383EC000, 0x383EE000, 0x383F0000, 0x383F2000, 0x383F4000, 0x383F6000, 0x383F8000, 0x383FA000, 0x383FC000, 0x383FE000,
1225 0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840A000, 0x3840C000, 0x3840E000, 0x38410000, 0x38412000, 0x38414000, 0x38416000, 0x38418000, 0x3841A000, 0x3841C000, 0x3841E000,
1226 0x38420000, 0x38422000, 0x38424000, 0x38426000, 0x38428000, 0x3842A000, 0x3842C000, 0x3842E000, 0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843A000, 0x3843C000, 0x3843E000,
1227 0x38440000, 0x38442000, 0x38444000, 0x38446000, 0x38448000, 0x3844A000, 0x3844C000, 0x3844E000, 0x38450000, 0x38452000, 0x38454000, 0x38456000, 0x38458000, 0x3845A000, 0x3845C000, 0x3845E000,
1228 0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846A000, 0x3846C000, 0x3846E000, 0x38470000, 0x38472000, 0x38474000, 0x38476000, 0x38478000, 0x3847A000, 0x3847C000, 0x3847E000,
1229 0x38480000, 0x38482000, 0x38484000, 0x38486000, 0x38488000, 0x3848A000, 0x3848C000, 0x3848E000, 0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849A000, 0x3849C000, 0x3849E000,
1230 0x384A0000, 0x384A2000, 0x384A4000, 0x384A6000, 0x384A8000, 0x384AA000, 0x384AC000, 0x384AE000, 0x384B0000, 0x384B2000, 0x384B4000, 0x384B6000, 0x384B8000, 0x384BA000, 0x384BC000, 0x384BE000,
1231 0x384C0000, 0x384C2000, 0x384C4000, 0x384C6000, 0x384C8000, 0x384CA000, 0x384CC000, 0x384CE000, 0x384D0000, 0x384D2000, 0x384D4000, 0x384D6000, 0x384D8000, 0x384DA000, 0x384DC000, 0x384DE000,
1232 0x384E0000, 0x384E2000, 0x384E4000, 0x384E6000, 0x384E8000, 0x384EA000, 0x384EC000, 0x384EE000, 0x384F0000, 0x384F2000, 0x384F4000, 0x384F6000, 0x384F8000, 0x384FA000, 0x384FC000, 0x384FE000,
1233 0x38500000, 0x38502000, 0x38504000, 0x38506000, 0x38508000, 0x3850A000, 0x3850C000, 0x3850E000, 0x38510000, 0x38512000, 0x38514000, 0x38516000, 0x38518000, 0x3851A000, 0x3851C000, 0x3851E000,
1234 0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852A000, 0x3852C000, 0x3852E000, 0x38530000, 0x38532000, 0x38534000, 0x38536000, 0x38538000, 0x3853A000, 0x3853C000, 0x3853E000,
1235 0x38540000, 0x38542000, 0x38544000, 0x38546000, 0x38548000, 0x3854A000, 0x3854C000, 0x3854E000, 0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855A000, 0x3855C000, 0x3855E000,
1236 0x38560000, 0x38562000, 0x38564000, 0x38566000, 0x38568000, 0x3856A000, 0x3856C000, 0x3856E000, 0x38570000, 0x38572000, 0x38574000, 0x38576000, 0x38578000, 0x3857A000, 0x3857C000, 0x3857E000,
1237 0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858A000, 0x3858C000, 0x3858E000, 0x38590000, 0x38592000, 0x38594000, 0x38596000, 0x38598000, 0x3859A000, 0x3859C000, 0x3859E000,
1238 0x385A0000, 0x385A2000, 0x385A4000, 0x385A6000, 0x385A8000, 0x385AA000, 0x385AC000, 0x385AE000, 0x385B0000, 0x385B2000, 0x385B4000, 0x385B6000, 0x385B8000, 0x385BA000, 0x385BC000, 0x385BE000,
1239 0x385C0000, 0x385C2000, 0x385C4000, 0x385C6000, 0x385C8000, 0x385CA000, 0x385CC000, 0x385CE000, 0x385D0000, 0x385D2000, 0x385D4000, 0x385D6000, 0x385D8000, 0x385DA000, 0x385DC000, 0x385DE000,
1240 0x385E0000, 0x385E2000, 0x385E4000, 0x385E6000, 0x385E8000, 0x385EA000, 0x385EC000, 0x385EE000, 0x385F0000, 0x385F2000, 0x385F4000, 0x385F6000, 0x385F8000, 0x385FA000, 0x385FC000, 0x385FE000,
1241 0x38600000, 0x38602000, 0x38604000, 0x38606000, 0x38608000, 0x3860A000, 0x3860C000, 0x3860E000, 0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861A000, 0x3861C000, 0x3861E000,
1242 0x38620000, 0x38622000, 0x38624000, 0x38626000, 0x38628000, 0x3862A000, 0x3862C000, 0x3862E000, 0x38630000, 0x38632000, 0x38634000, 0x38636000, 0x38638000, 0x3863A000, 0x3863C000, 0x3863E000,
1243 0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864A000, 0x3864C000, 0x3864E000, 0x38650000, 0x38652000, 0x38654000, 0x38656000, 0x38658000, 0x3865A000, 0x3865C000, 0x3865E000,
1244 0x38660000, 0x38662000, 0x38664000, 0x38666000, 0x38668000, 0x3866A000, 0x3866C000, 0x3866E000, 0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867A000, 0x3867C000, 0x3867E000,
1245 0x38680000, 0x38682000, 0x38684000, 0x38686000, 0x38688000, 0x3868A000, 0x3868C000, 0x3868E000, 0x38690000, 0x38692000, 0x38694000, 0x38696000, 0x38698000, 0x3869A000, 0x3869C000, 0x3869E000,
1246 0x386A0000, 0x386A2000, 0x386A4000, 0x386A6000, 0x386A8000, 0x386AA000, 0x386AC000, 0x386AE000, 0x386B0000, 0x386B2000, 0x386B4000, 0x386B6000, 0x386B8000, 0x386BA000, 0x386BC000, 0x386BE000,
1247 0x386C0000, 0x386C2000, 0x386C4000, 0x386C6000, 0x386C8000, 0x386CA000, 0x386CC000, 0x386CE000, 0x386D0000, 0x386D2000, 0x386D4000, 0x386D6000, 0x386D8000, 0x386DA000, 0x386DC000, 0x386DE000,
1248 0x386E0000, 0x386E2000, 0x386E4000, 0x386E6000, 0x386E8000, 0x386EA000, 0x386EC000, 0x386EE000, 0x386F0000, 0x386F2000, 0x386F4000, 0x386F6000, 0x386F8000, 0x386FA000, 0x386FC000, 0x386FE000,
1249 0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870A000, 0x3870C000, 0x3870E000, 0x38710000, 0x38712000, 0x38714000, 0x38716000, 0x38718000, 0x3871A000, 0x3871C000, 0x3871E000,
1250 0x38720000, 0x38722000, 0x38724000, 0x38726000, 0x38728000, 0x3872A000, 0x3872C000, 0x3872E000, 0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873A000, 0x3873C000, 0x3873E000,
1251 0x38740000, 0x38742000, 0x38744000, 0x38746000, 0x38748000, 0x3874A000, 0x3874C000, 0x3874E000, 0x38750000, 0x38752000, 0x38754000, 0x38756000, 0x38758000, 0x3875A000, 0x3875C000, 0x3875E000,
1252 0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876A000, 0x3876C000, 0x3876E000, 0x38770000, 0x38772000, 0x38774000, 0x38776000, 0x38778000, 0x3877A000, 0x3877C000, 0x3877E000,
1253 0x38780000, 0x38782000, 0x38784000, 0x38786000, 0x38788000, 0x3878A000, 0x3878C000, 0x3878E000, 0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879A000, 0x3879C000, 0x3879E000,
1254 0x387A0000, 0x387A2000, 0x387A4000, 0x387A6000, 0x387A8000, 0x387AA000, 0x387AC000, 0x387AE000, 0x387B0000, 0x387B2000, 0x387B4000, 0x387B6000, 0x387B8000, 0x387BA000, 0x387BC000, 0x387BE000,
1255 0x387C0000, 0x387C2000, 0x387C4000, 0x387C6000, 0x387C8000, 0x387CA000, 0x387CC000, 0x387CE000, 0x387D0000, 0x387D2000, 0x387D4000, 0x387D6000, 0x387D8000, 0x387DA000, 0x387DC000, 0x387DE000,
1256 0x387E0000, 0x387E2000, 0x387E4000, 0x387E6000, 0x387E8000, 0x387EA000, 0x387EC000, 0x387EE000, 0x387F0000, 0x387F2000, 0x387F4000, 0x387F6000, 0x387F8000, 0x387FA000, 0x387FC000, 0x387FE000 };
1258 0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000, 0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000, 0x06000000, 0x06800000, 0x07000000, 0x07800000,
1259 0x08000000, 0x08800000, 0x09000000, 0x09800000, 0x0A000000, 0x0A800000, 0x0B000000, 0x0B800000, 0x0C000000, 0x0C800000, 0x0D000000, 0x0D800000, 0x0E000000, 0x0E800000, 0x0F000000, 0x47800000,
1260 0x80000000, 0x80800000, 0x81000000, 0x81800000, 0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000, 0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000,
1261 0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8A000000, 0x8A800000, 0x8B000000, 0x8B800000, 0x8C000000, 0x8C800000, 0x8D000000, 0x8D800000, 0x8E000000, 0x8E800000, 0x8F000000, 0xC7800000 };
1262 static const unsigned short offset_table[64] = {
1263 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,
1264 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 };
1265 bits<float>::type fbits = mantissa_table[offset_table[value>>10]+(value&0x3FF)] + exponent_table[value>>10];
1268 std::memcpy(&out, &fbits,
sizeof(
float));
1278 #if HALF_ENABLE_F16C_INTRINSICS
1279 return _mm_cvtsd_f64(_mm_cvtps_pd(_mm_cvtph_ps(_mm_cvtsi32_si128(value))));
1282 unsigned int abs = value & 0x7FFF;
1285 hi |= 0x3F000000 <<
static_cast<unsigned>(
abs>=0x7C00);
1286 for(;
abs<0x400;
abs<<=1,hi-=0x100000) ;
1291 std::memcpy(&out, &dbits,
sizeof(
double));
1303 unsigned int abs = value & 0x7FFF;
1305 out = (std::numeric_limits<T>::has_signaling_NaN && !(
abs&0x200)) ? std::numeric_limits<T>::signaling_NaN() :
1306 std::numeric_limits<T>::has_quiet_NaN ? std::numeric_limits<T>::quiet_NaN() : T();
1307 else if(
abs == 0x7C00)
1309 else if(
abs > 0x3FF)
1313 return (value&0x8000) ? -out : out;
1334 template<std::
float_round_style R,
bool E,
bool I,
typename T> T
half2int(
unsigned int value)
1336 unsigned int abs = value & 0x7FFF;
1345 return (R==std::round_toward_infinity) ? T(~(value>>15)&(
abs!=0)) :
1346 (R==std::round_toward_neg_infinity) ? -T(value>0x8000) :
1349 int exp = 25 - (
abs>>10);
1350 unsigned int m = (value&0x3FF) | 0x400;
1352 (R==std::round_to_nearest) ? ((1<<(
exp-1))-(~(m>>
exp)&E)) :
1353 (R==std::round_toward_infinity) ? (((1<<
exp)-1)&((value>>15)-1)) :
1354 (R==std::round_toward_neg_infinity) ? (((1<<
exp)-1)&-(value>>15)) : 0))>>
exp));
1355 if((!std::numeric_limits<T>::is_signed && (value&0x8000)) || (std::numeric_limits<T>::digits<16 &&
1358 else if(I &&
exp > 0 && (m&((1<<
exp)-1)))
1360 return static_cast<T
>((value&0x8000) ? -i : i);
1374 uint32 xy = (x>>16) * (y&0xFFFF), yx = (x&0xFFFF) * (y>>16), c = (xy&0xFFFF) + (yx&0xFFFF) + (((x&0xFFFF)*(y&0xFFFF))>>16);
1375 return (x>>16)*(y>>16) + (xy>>16) + (yx>>16) + (c>>16) +
1376 ((R==std::round_to_nearest) ? ((c>>15)&1) : (R==std::round_toward_infinity) ? ((c&0xFFFF)!=0) : 0);
1385 #if HALF_ENABLE_CPP11_LONG_LONG
1386 return static_cast<uint32>((
static_cast<unsigned long long>(x)*
static_cast<unsigned long long>(y)+0x80000000)>>32);
1388 return mulhi<std::round_to_nearest>(x, y);
1399 #if HALF_ENABLE_CPP11_LONG_LONG
1400 unsigned long long xx =
static_cast<unsigned long long>(x) << 32;
1401 return s = (xx%y!=0),
static_cast<uint32>(xx/y);
1405 for(
unsigned int i=0; i<32; ++i)
1415 return s = rem > 1, div;
1426 template<
bool Q,
bool R>
unsigned int mod(
unsigned int x,
unsigned int y,
int *quo = NULL)
1431 int absx = x, absy = y, expx = 0, expy = 0;
1432 for(; absx<0x400; absx<<=1,--expx) ;
1433 for(; absy<0x400; absy<<=1,--expy) ;
1436 int mx = (absx&0x3FF) | 0x400, my = (absy&0x3FF) | 0x400;
1437 for(
int d=expx-expy; d; --d)
1447 q <<= static_cast<int>(Q);
1458 q &= (1<<(std::numeric_limits<int>::digits-1)) - 1;
1462 for(; mx<0x400; mx<<=1,--expy) ;
1463 x = (expy>0) ? ((expy<<10)|(mx&0x3FF)) : (mx>>(1-expy));
1470 a = (x<0x400) ? (x<<1) : (x+0x400);
1478 if(a > b || (a == b && (q&1)))
1480 int exp = (y>>10) + (y<=0x3FF), d =
exp - (x>>10) - (x<=0x3FF);
1481 int m = (((y&0x3FF)|((y>0x3FF)<<10))<<1) - (((x&0x3FF)|((x>0x3FF)<<10))<<(1-d));
1482 for(; m<0x800 && exp>1; m<<=1,--
exp) ;
1483 x = 0x8000 + ((
exp-1)<<10) + (m>>1);
1503 for(
uint32 bit=
static_cast<uint32>(1)<<F; bit; bit>>=2)
1524 0x80000000, 0x4AE00D1D, 0x2934F098, 0x15C01A3A, 0x0B31FB7D, 0x05AEB4DD, 0x02DCF2D1, 0x016FE50B,
1525 0x00B84E23, 0x005C3E10, 0x002E24CA, 0x001713D6, 0x000B8A47, 0x0005C53B, 0x0002E2A3, 0x00017153,
1526 0x0000B8AA, 0x00005C55, 0x00002E2B, 0x00001715, 0x00000B8B, 0x000005C5, 0x000002E3, 0x00000171,
1527 0x000000B9, 0x0000005C, 0x0000002E, 0x00000017, 0x0000000C, 0x00000006, 0x00000003, 0x00000001 };
1530 uint32 mx = 0x80000000, my = 0;
1531 for(
unsigned int i=1; i<n; ++i)
1551 0x80000000, 0x4AE00D1D, 0x2934F098, 0x15C01A3A, 0x0B31FB7D, 0x05AEB4DD, 0x02DCF2D1, 0x016FE50B,
1552 0x00B84E23, 0x005C3E10, 0x002E24CA, 0x001713D6, 0x000B8A47, 0x0005C53B, 0x0002E2A3, 0x00017153,
1553 0x0000B8AA, 0x00005C55, 0x00002E2B, 0x00001715, 0x00000B8B, 0x000005C5, 0x000002E3, 0x00000171,
1554 0x000000B9, 0x0000005C, 0x0000002E, 0x00000017, 0x0000000C, 0x00000006, 0x00000003, 0x00000001 };
1557 uint32 mx = 0x40000000, my = 0;
1558 for(
unsigned int i=1; i<n; ++i)
1560 uint32 mz = mx + (mx>>i);
1577 static const uint32 angles[] = {
1578 0x3243F6A9, 0x1DAC6705, 0x0FADBAFD, 0x07F56EA7, 0x03FEAB77, 0x01FFD55C, 0x00FFFAAB, 0x007FFF55,
1579 0x003FFFEB, 0x001FFFFD, 0x00100000, 0x00080000, 0x00040000, 0x00020000, 0x00010000, 0x00008000,
1580 0x00004000, 0x00002000, 0x00001000, 0x00000800, 0x00000400, 0x00000200, 0x00000100, 0x00000080,
1581 0x00000040, 0x00000020, 0x00000010, 0x00000008, 0x00000004, 0x00000002, 0x00000001 };
1582 uint32 mx = 0x26DD3B6A, my = 0;
1583 for(
unsigned int i=0; i<n; ++i)
1588 mx = tx; my = ty; mz -= (angles[i]^sign) - sign;
1590 return std::make_pair(my, mx);
1601 static const uint32 angles[] = {
1602 0x3243F6A9, 0x1DAC6705, 0x0FADBAFD, 0x07F56EA7, 0x03FEAB77, 0x01FFD55C, 0x00FFFAAB, 0x007FFF55,
1603 0x003FFFEB, 0x001FFFFD, 0x00100000, 0x00080000, 0x00040000, 0x00020000, 0x00010000, 0x00008000,
1604 0x00004000, 0x00002000, 0x00001000, 0x00000800, 0x00000400, 0x00000200, 0x00000100, 0x00000080,
1605 0x00000040, 0x00000020, 0x00000010, 0x00000008, 0x00000004, 0x00000002, 0x00000001 };
1607 for(
unsigned int i=0; i<n; ++i)
1612 mx = tx; my = ty; mz += (angles[i]^sign) - sign;
1624 int exp = (
abs>>10) + (
abs<=0x3FF) - 15;
1626 return k = 0, m << (
exp+20);
1627 #if HALF_ENABLE_CPP11_LONG_LONG
1628 unsigned long long y = m * 0xA2F9836E4E442, mask = (1ULL<<(62-
exp)) - 1, yi = (y+(mask>>1)) & ~mask, f = y - yi;
1630 k =
static_cast<int>(yi>>(62-
exp));
1631 return (
multiply64(
static_cast<uint32>((sign ? -f : f)>>(31-
exp)), 0xC90FDAA2)^sign) - sign;
1633 uint32 yh = m*0xA2F98 + mulhi<std::round_toward_zero>(m, 0x36E4E442), yl = (m*0x36E4E442) & 0xFFFFFFFF;
1634 uint32 mask = (
static_cast<uint32>(1)<<(30-
exp)) - 1, yi = (yh+(mask>>1)) & ~mask, sign = -
static_cast<uint32>(yi>yh);
1635 k =
static_cast<int>(yi>>(30-
exp));
1636 uint32 fh = (yh^sign) + (yi^~sign) - ~sign, fl = (yl^sign) - sign;
1637 return (
multiply64((
exp>-1) ? (((fh<<(1+
exp))&0xFFFFFFFF)|((fl&0xFFFFFFFF)>>(31-
exp))) : fh, 0xC90FDAA2)^sign) - sign;
1649 uint32 my = ((
abs&0x3FF)|0x400) << 5, r = my * my;
1651 r = 0x40000000 - ((rexp>-31) ? ((r>>-rexp)|((r&((
static_cast<uint32>(1)<<-rexp)-1))!=0)) : 1);
1652 for(rexp=0; r<0x40000000; r<<=1,--rexp) ;
1653 uint32 mx = sqrt<30>(r, rexp);
1656 return std::make_pair((d<-14) ? ((my>>(-d-14))+((my>>(-d-15))&1)) : (my<<(14+d)), (mx<<14)+(r<<13)/mx);
1658 return std::make_pair(my<<14, (d>14) ? ((mx>>(d-14))+((mx>>(d-15))&1)) : ((d==14) ? mx : ((mx<<(14-d))+(r<<(13-d))/mx)));
1659 return std::make_pair(my<<13, (mx<<13)+(r<<12)/mx);
1670 int e = (
abs>>10) + (
abs<=0x3FF);
1679 mx = (mx<<(e-14)) & 0x7FFFFFFF;
1682 int d =
exp << 1, s;
1691 return std::make_pair(mx, (d<31) ? ((my>>d)|((my&((
static_cast<uint32>(1)<<d)-1))!=0)) : 1);
1705 template<std::
float_round_style R>
unsigned int exp2_post(
uint32 m,
int exp,
bool esign,
unsigned int sign = 0,
unsigned int n = 32)
1711 return underflow<R>(sign);
1713 return rounded<R,false>(sign, 1, m!=0);
1716 return overflow<R>(sign);
1723 return fixed2half<R,31,false,false,true>(m,
exp+14, sign, s);
1737 template<std::
float_round_style R,u
int32 L>
unsigned int log2_post(
uint32 m,
int ilog,
int exp,
unsigned int sign = 0)
1740 m = (((
static_cast<uint32>(ilog)<<27)+(m>>4))^msign) - msign;
1743 for(; m<0x80000000; m<<=1,--
exp) ;
1747 sign ^= msign & 0x8000;
1749 return underflow<R>(sign);
1751 return fixed2half<R,30,false,false,true>(m,
exp, sign, 1);
1766 return overflow<R>();
1768 return underflow<R>();
1771 return fixed2half<R,15,false,false,false>(m,
exp-1, 0, r!=0);
1786 int i = my >= mx, s;
1789 return overflow<R>(sign);
1791 return underflow<R>(sign);
1793 return fixed2half<R,30,false,false,true>(m,
exp, sign, s);
1805 template<std::
float_round_style R,
bool S>
unsigned int area(
unsigned int arg)
1807 int abs = arg & 0x7FFF, expx = (
abs>>10) + (
abs<=0x3FF) - 15, expy = -15, ilog, i;
1809 for(;
abs<0x400;
abs<<=1,--expy) ;
1811 r = ((
abs&0x3FF)|0x400) << 5;
1820 r = 0x40000000 + ((expy>-30) ? ((r>>-expy)|((r&((
static_cast<uint32>(1)<<-expy)-1))!=0)) : 1);
1825 r += 0x40000000 >> expy;
1833 r -= 0x40000000 >> expy;
1834 for(; r<0x40000000; r<<=1,--expy) ;
1836 my = sqrt<30>(r, expy);
1837 my = (my<<15) + (r<<14)/my;
1850 static const int G = S && (R==std::round_to_nearest);
1851 return log2_post<R,0xB8AA3B2A>(
log2(my>>i, 26+S+G)+(G<<3), ilog+i, 17, arg&(
static_cast<unsigned>(S)<<15));
1867 m =
static_cast<uint32>((
abs&0x3FF)|0x400) << 21;
1880 uint32 m = a.
m + ((d<32) ? (b.
m>>d) : 0);
1881 int i = (
m&0xFFFFFFFF) < a.
m;
1882 return f31(((
m+i)>>i)|0x80000000, a.
exp+i);
1892 uint32 m = a.
m - ((d<32) ? (b.
m>>d) : 0);
1895 for(;
m<0x80000000;
m<<=1,--
exp) ;
1916 int i = a.
m >= b.
m, s;
1935 template<std::
float_round_style R,
bool C>
unsigned int erf(
unsigned int arg)
1937 unsigned int abs = arg & 0x7FFF, sign = arg & 0x8000;
1938 f31 x(
abs), x2 = x * x *
f31(0xB8AA3B29, 0), t =
f31(0x80000000, 0) / (
f31(0x80000000, 0)+
f31(0xA7BA054A, -2)*x), t2 = t * t;
1939 f31 e = ((
f31(0x87DC2213, 0)*t2+
f31(0xB5F0E2AE, 0))*t2+
f31(0x82790637, -2)-(
f31(0xBA00E2B8, 0)*t2+
f31(0x91A98E62, -2))*t) * t /
1941 return (!C || sign) ? fixed2half<R,31,false,true,true>(0x80000000-(e.
m>>(C-e.
exp)), 14+C, sign&(C-1U)) :
1942 (e.
exp<-25) ? underflow<R>() : fixed2half<R,30,false,false,true>(e.
m>>1, e.
exp+14, 0, e.
m&1);
1954 template<std::
float_round_style R,
bool L>
unsigned int gamma(
unsigned int arg)
1961 static const f31 pi(0xC90FDAA2, 1), lbe(0xB8AA3B29, 0);
1962 unsigned int abs = arg & 0x7FFF, sign = arg & 0x8000;
1963 bool bsign = sign != 0;
1964 f31 z(
abs), x = sign ? (z+
f31(0x80000000, 0)) : z, t = x +
f31(0x94CCCCCD, 2), s =
1965 f31(0xA06C9901, 1) +
f31(0xBBE654E2, -7)/(x+
f31(0x80000000, 2)) +
f31(0xA1CE6098, 6)/(x+
f31(0x80000000, 1))
1966 +
f31(0xE1868CB7, 7)/x -
f31(0x8625E279, 8)/(x+
f31(0x80000000, 0)) -
f31(0xA03E158F, 2)/(x+
f31(0xC0000000, 1));
1967 int i = (s.exp>=2) + (s.exp>=4) + (s.exp>=8) + (s.exp>=16);
1968 s =
f31((
static_cast<uint32>(s.exp)<<(31-i))+(
log2(s.m>>1, 28)>>i), i) / lbe;
1969 if(x.
exp != -1 || x.
m != 0x80000000)
1971 i = (t.exp>=2) + (t.exp>=4) + (t.exp>=8);
1972 f31 l =
f31((
static_cast<uint32>(t.exp)<<(31-i))+(
log2(t.m>>1, 30)>>i), i) / lbe;
1973 s = (x.
exp<-1) ? (s-(
f31(0x80000000, -1)-x)*l) : (s+(x-
f31(0x80000000, -1))*l);
1975 s = x.
exp ? (s-t) : (t-s);
1980 sign &= (L|((z.m>>(31-z.exp))&1)) - 1;
1981 for(z=
f31((z.m<<(1+z.exp))&0xFFFFFFFF, -1); z.
m<0x80000000; z.m<<=1,--z.exp) ;
1984 z =
f31(0x80000000, 0) - z;
1988 z.
m =
sincos(z.m>>(1-z.exp), 30).first;
1989 for(z.exp=1; z.m<0x80000000; z.m<<=1,--z.exp) ;
1992 z =
f31(0x80000000, 0);
1998 f31 l(0x92868247, 0);
2002 z =
f31(-((
static_cast<uint32>(z.exp)<<26)+(m>>5)), 5);
2003 for(; z.m<0x80000000; z.m<<=1,--z.exp) ;
2006 sign =
static_cast<unsigned>(x.
exp&&(l.
exp<s.exp||(l.
exp==s.exp&&l.
m<s.m))) << 15;
2007 s = sign ? (s-l) : x.
exp ? (l-s) : (l+s);
2011 sign =
static_cast<unsigned>(x.
exp==0) << 15;
2013 return underflow<R>(sign);
2015 return overflow<R>(sign);
2029 m = (s.m<<s.exp) & 0x7FFFFFFF;
2030 s.exp = (s.m>>(31-s.exp));
2034 s =
f31(0x80000000, 0) / s;
2041 return underflow<R>(sign);
2043 else if(z.exp > 0 && !(z.m&((1<<(31-z.exp))-1)))
2044 return ((s.exp+14)<<10) + (s.m>>21);
2046 return overflow<R>(sign);
2048 return fixed2half<R,31,false,false,true>(s.m, s.exp+14, sign);
2052 template<
typename,
typename,std::
float_round_style>
struct half_caster;
2090 operator float()
const {
return detail::half2float<float>(data_); }
2181 static const std::float_round_style round_style = (std::float_round_style)(
HALF_ROUND_STYLE);
2190 #ifndef HALF_DOXYGEN_ONLY
2202 template<
typename charT,
typename traits>
friend std::basic_ostream<charT,traits>&
operator<<(std::basic_ostream<charT,traits>&,
half);
2203 template<
typename charT,
typename traits>
friend std::basic_istream<charT,traits>&
operator>>(std::basic_istream<charT,traits>&,
half&);
2252 #ifdef HALF_ENABLE_CPP11_LONG_LONG
2253 friend long long llround(
half);
2254 friend long long llrint(
half);
2276 friend class std::numeric_limits<
half>;
2277 #if HALF_ENABLE_CPP11_HASH
2278 friend struct std::hash<
half>;
2280 #if HALF_ENABLE_CPP11_USER_LITERALS
2281 friend half literal::operator
"" _h(
long double);
2286 #if HALF_ENABLE_CPP11_USER_LITERALS
2296 inline half operator "" _h(
long double value) {
return half(
detail::binary, detail::float2half<half::round_style>(value)); }
2308 template<
typename T,
typename U,std::
float_round_style R=(std::
float_round_style)(HALF_ROUND_STYLE)>
struct half_caster {};
2311 #if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
2312 static_assert(std::is_arithmetic<U>::value,
"half_cast from non-arithmetic type unsupported");
2323 #if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
2324 static_assert(std::is_arithmetic<T>::value,
"half_cast to non-arithmetic type unsupported");
2330 static T cast_impl(
half arg,
true_type) {
return half2float<T>(arg.data_); }
2331 static T cast_impl(
half arg,
false_type) {
return half2int<R,true,true,T>(arg.data_); }
2384 #if HALF_ERRHANDLING_THROWS
2450 #if HALF_ENABLE_CPP11_HASH
2461 typedef size_t result_type;
2466 result_type operator()(argument_type arg)
const {
return hash<half_float::detail::uint16>()(arg.data_&-
static_cast<unsigned>(arg.data_!=0x8000)); }
2485 return !
detail::compsignal(x.data_, y.data_) && (x.data_==y.data_ || !((x.data_|y.data_)&0x7FFF));
2496 return detail::compsignal(x.data_, y.data_) || (x.data_!=y.data_ && ((x.data_|y.data_)&0x7FFF));
2508 ((x.data_^(0x8000|(0x8000-(x.data_>>15))))+(x.data_>>15)) < ((y.data_^(0x8000|(0x8000-(y.data_>>15))))+(y.data_>>15));
2520 ((x.data_^(0x8000|(0x8000-(x.data_>>15))))+(x.data_>>15)) > ((y.data_^(0x8000|(0x8000-(y.data_>>15))))+(y.data_>>15));
2532 ((x.data_^(0x8000|(0x8000-(x.data_>>15))))+(x.data_>>15)) <= ((y.data_^(0x8000|(0x8000-(y.data_>>15))))+(y.data_>>15));
2544 ((x.data_^(0x8000|(0x8000-(x.data_>>15))))+(x.data_>>15)) >= ((y.data_^(0x8000|(0x8000-(y.data_>>15))))+(y.data_>>15));
2571 #ifdef HALF_ARITHMETIC_TYPE
2572 return half(
detail::binary, detail::float2half<half::round_style>(detail::half2float<detail::internal_t>(x.data_)+detail::half2float<detail::internal_t>(y.data_)));
2574 int absx = x.data_ & 0x7FFF, absy = y.data_ & 0x7FFF;
2575 bool sub = ((x.data_^y.data_)&0x8000) != 0;
2576 if(absx >= 0x7C00 || absy >= 0x7C00)
2580 return absy ? y :
half(
detail::binary, (half::round_style==std::round_toward_neg_infinity) ? (x.data_|y.data_) : (x.data_&y.data_));
2583 unsigned int sign = ((sub && absy>absx) ? y.data_ : x.data_) & 0x8000;
2586 int exp = (absx>>10) + (absx<=0x3FF), d =
exp - (absy>>10) - (absy<=0x3FF), mx = ((absx&0x3FF)|((absx>0x3FF)<<10)) << 3, my;
2589 my = ((absy&0x3FF)|((absy>0x3FF)<<10)) << 3;
2590 my = (my>>d) | ((my&((1<<d)-1))!=0);
2597 return half(
detail::binary,
static_cast<unsigned>(half::round_style==std::round_toward_neg_infinity)<<15);
2598 for(; mx<0x2000 && exp>1; mx<<=1,--
exp) ;
2606 mx = (mx>>i) | (mx&i);
2608 return half(
detail::binary, detail::rounded<half::round_style,false>(sign+((
exp-1)<<10)+(mx>>3), (mx>>2)&1, (mx&0x3)!=0));
2621 #ifdef HALF_ARITHMETIC_TYPE
2622 return half(
detail::binary, detail::float2half<half::round_style>(detail::half2float<detail::internal_t>(x.data_)-detail::half2float<detail::internal_t>(y.data_)));
2637 #ifdef HALF_ARITHMETIC_TYPE
2638 return half(
detail::binary, detail::float2half<half::round_style>(detail::half2float<detail::internal_t>(x.data_)*detail::half2float<detail::internal_t>(y.data_)));
2640 int absx = x.data_ & 0x7FFF, absy = y.data_ & 0x7FFF,
exp = -16;
2641 unsigned int sign = (x.data_^y.data_) & 0x8000;
2642 if(absx >= 0x7C00 || absy >= 0x7C00)
2644 ((absx==0x7C00 && !absy)||(absy==0x7C00 && !absx)) ?
detail::invalid() : (sign|0x7C00));
2647 for(; absx<0x400; absx<<=1,--
exp) ;
2648 for(; absy<0x400; absy<<=1,--
exp) ;
2650 int i = m >> 21, s = m & i;
2651 exp += (absx>>10) + (absy>>10) + i;
2656 return half(
detail::binary, detail::fixed2half<half::round_style,20,false,false,false>(m>>i,
exp, sign, s));
2670 #ifdef HALF_ARITHMETIC_TYPE
2671 return half(
detail::binary, detail::float2half<half::round_style>(detail::half2float<detail::internal_t>(x.data_)/detail::half2float<detail::internal_t>(y.data_)));
2673 int absx = x.data_ & 0x7FFF, absy = y.data_ & 0x7FFF,
exp = 14;
2674 unsigned int sign = (x.data_^y.data_) & 0x8000;
2675 if(absx >= 0x7C00 || absy >= 0x7C00)
2677 (absx==absy) ?
detail::invalid() : (sign|((absx==0x7C00) ? 0x7C00 : 0)));
2682 for(; absx<0x400; absx<<=1,--
exp) ;
2683 for(; absy<0x400; absy<<=1,++
exp) ;
2684 detail::uint32 mx = (absx&0x3FF) | 0x400, my = (absy&0x3FF) | 0x400;
2686 exp += (absx>>10) - (absy>>10) - i;
2693 return half(
detail::binary, detail::fixed2half<half::round_style,11,false,false,false>(mx/my,
exp, sign, mx%my!=0));
2707 template<
typename charT,
typename traits> std::basic_ostream<charT,traits>&
operator<<(std::basic_ostream<charT,traits> &out,
half arg)
2709 #ifdef HALF_ARITHMETIC_TYPE
2710 return out << detail::half2float<detail::internal_t>(arg.data_);
2712 return out << detail::half2float<float>(arg.data_);
2725 template<
typename charT,
typename traits> std::basic_istream<charT,traits>&
operator>>(std::basic_istream<charT,traits> &in,
half &arg)
2727 #ifdef HALF_ARITHMETIC_TYPE
2728 detail::internal_t f;
2733 arg.data_ = detail::float2half<half::round_style>(f);
2762 unsigned int absx = x.data_ & 0x7FFF, absy = y.data_ & 0x7FFF, sign = x.data_ & 0x8000;
2763 if(absx >= 0x7C00 || absy >= 0x7C00)
2783 unsigned int absx = x.data_ & 0x7FFF, absy = y.data_ & 0x7FFF, sign = x.data_ & 0x8000;
2784 if(absx >= 0x7C00 || absy >= 0x7C00)
2803 unsigned int absx = x.data_ & 0x7FFF, absy = y.data_ & 0x7FFF, value = x.data_ & 0x8000;
2804 if(absx >= 0x7C00 || absy >= 0x7C00)
2809 bool qsign = ((value^y.data_)&0x8000) != 0;
2812 value ^= detail::mod<true, true>(absx, absy, &q);
2828 #ifdef HALF_ARITHMETIC_TYPE
2829 detail::internal_t fx = detail::half2float<detail::internal_t>(x.data_), fy = detail::half2float<detail::internal_t>(y.data_), fz = detail::half2float<detail::internal_t>(z.data_);
2830 #if HALF_ENABLE_CPP11_CMATH && FP_FAST_FMA
2836 int absx = x.data_ & 0x7FFF, absy = y.data_ & 0x7FFF, absz = z.data_ & 0x7FFF,
exp = -15;
2837 unsigned int sign = (x.data_^y.data_) & 0x8000;
2838 bool sub = ((sign^z.data_)&0x8000) != 0;
2839 if(absx >= 0x7C00 || absy >= 0x7C00 || absz >= 0x7C00)
2844 return absz ? z :
half(
detail::binary, (half::round_style==std::round_toward_neg_infinity) ? (z.data_|sign) : (z.data_&sign));
2845 for(; absx<0x400; absx<<=1,--
exp) ;
2846 for(; absy<0x400; absy<<=1,--
exp) ;
2849 exp += (absx>>10) + (absy>>10) + i;
2854 for(; absz<0x400; absz<<=1,--expz) ;
2857 if(expz >
exp || (expz ==
exp && mz > m))
2862 sign = z.data_ & 0x8000;
2865 mz = (d<23) ? ((mz>>d)|((mz&((
static_cast<detail::uint32>(1)<<d)-1))!=0)) : 1;
2870 return half(
detail::binary,
static_cast<unsigned>(half::round_style==std::round_toward_neg_infinity)<<15);
2871 for(; m<0x800000; m<<=1,--
exp) ;
2885 return half(
detail::binary, detail::fixed2half<half::round_style,23,false,false,false>(m,
exp-1, sign));
2925 return (x.data_^(0x8000|(0x8000-(x.data_>>15)))) <= (y.data_^(0x8000|(0x8000-(y.data_>>15)))) ?
half(
detail::binary, 0) : (x-y);
2934 unsigned int value = 0x7FFF;
2936 value ^=
static_cast<unsigned>(*arg++) & 0xFF;
2955 #ifdef HALF_ARITHMETIC_TYPE
2956 return half(
detail::binary, detail::float2half<half::round_style>(
std::exp(detail::half2float<detail::internal_t>(arg.data_))));
2958 int abs = arg.data_ & 0x7FFF, e = (
abs>>10) + (
abs<=0x3FF),
exp;
2964 return half(
detail::binary, (arg.data_&0x8000) ? detail::underflow<half::round_style>() : detail::overflow<half::round_style>());
2974 m = (m<<(e-14)) & 0x7FFFFFFF;
2976 return half(
detail::binary, detail::exp2_post<half::round_style>(m,
exp, (arg.data_&0x8000)!=0, 0, 26));
2990 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
2993 int abs = arg.data_ & 0x7FFF, e = (
abs>>10) + (
abs<=0x3FF),
exp = (
abs&0x3FF) + ((
abs>0x3FF)<<10);
2999 return half(
detail::binary, (arg.data_&0x8000) ? detail::underflow<half::round_style>() : detail::overflow<half::round_style>());
3001 (
static_cast<detail::uint32>(
exp)<<(6+e))&0x7FFFFFFF,
exp>>(25-e), (arg.data_&0x8000)!=0, 0, 28));
3016 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
3019 unsigned int abs = arg.data_ & 0x7FFF, sign = arg.data_ & 0x8000, e = (
abs>>10) + (
abs<=0x3FF),
exp;
3025 return half(
detail::binary, (arg.data_&0x8000) ? detail::rounded<half::round_style,true>(0xBBFF, 1, 1) : detail::overflow<half::round_style>());
3035 m = (m<<(e-14)) & 0x7FFFFFFF;
3050 m -= (
exp<31) ? (0x80000000>>
exp) : 1;
3051 for(
exp+=14; m<0x80000000 &&
exp; m<<=1,--
exp) ;
3054 return half(
detail::binary, detail::rounded<half::round_style,true>(sign+(
exp<<10)+(m>>21), (m>>20)&1, (m&0xFFFFF)!=0));
3069 #ifdef HALF_ARITHMETIC_TYPE
3070 return half(
detail::binary, detail::float2half<half::round_style>(
std::log(detail::half2float<detail::internal_t>(arg.data_))));
3072 int abs = arg.data_ & 0x7FFF,
exp = -15;
3075 if(arg.data_ & 0x8000)
3097 #ifdef HALF_ARITHMETIC_TYPE
3100 int abs = arg.data_ & 0x7FFF,
exp = -15;
3103 if(arg.data_ & 0x8000)
3132 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
3135 int abs = arg.data_ & 0x7FFF,
exp = -15, s = 0;
3138 if(arg.data_ & 0x8000)
3148 unsigned int value =
static_cast<unsigned>(
exp<0) << 15, m =
std::abs(
exp) << 6;
3149 for(
exp=18; m<0x400; m<<=1,--
exp) ;
3153 (((ilog<<27)+(detail::log2(static_cast<detail::uint32>((
abs&0x3FF)|0x400)<<20, 28)>>4))^sign) - sign;
3156 for(
exp=14; m<0x8000000 &&
exp; m<<=1,--
exp) ;
3157 for(; m>0xFFFFFFF; m>>=1,++
exp)
3159 return half(
detail::binary, detail::fixed2half<half::round_style,27,false,false,true>(m,
exp, sign&0x8000, s));
3175 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
3178 if(arg.data_ >= 0xBC00)
3180 int abs = arg.data_ & 0x7FFF,
exp = -15;
3181 if(!
abs ||
abs >= 0x7C00)
3186 if(arg.data_ & 0x8000)
3188 m = 0x40000000 - (m>>-
exp);
3189 for(
exp=0; m<0x40000000; m<<=1,--
exp) ;
3195 m = 0x40000000 + (m>>-
exp);
3200 m += 0x40000000 >>
exp;
3225 #ifdef HALF_ARITHMETIC_TYPE
3228 int abs = arg.data_ & 0x7FFF,
exp = 15;
3229 if(!
abs || arg.data_ >= 0x7C00)
3233 return half(
detail::binary, detail::rounded<half::round_style,false>((
exp<<10)+(m&0x3FF), r>m, r!=0));
3246 #ifdef HALF_ARITHMETIC_TYPE
3247 return half(
detail::binary, detail::float2half<half::round_style>(detail::internal_t(1)/
std::sqrt(detail::half2float<detail::internal_t>(arg.data_))));
3249 unsigned int abs = arg.data_ & 0x7FFF, bias = 0x4000;
3250 if(!
abs || arg.data_ >= 0x7C00)
3253 for(;
abs<0x400;
abs<<=1,bias-=0x400) ;
3254 unsigned int frac = (
abs+=bias) & 0x7FF;
3257 if((half::round_style == std::round_to_nearest && (frac == 0x3FE || frac == 0x76C)) ||
3258 (half::round_style != std::round_to_nearest && (frac == 0x15A || frac == 0x3FC || frac == 0x401 || frac == 0x402 || frac == 0x67B)))
3260 detail::uint32 f = 0x17376 -
abs, mx = (
abs&0x3FF) | 0x400, my = ((f>>1)&0x3FF) | 0x400, mz = my * my;
3261 int expy = (f>>11) - 31, expx = 32 - (
abs>>10), i = mz >> 21;
3262 for(mz=0x60000000-(((mz>>i)*mx)>>(expx-2*expy-i)); mz<0x40000000; mz<<=1,--expy) ;
3263 i = (my*=mz>>10) >> 31;
3265 my = (my>>(20+i)) + 1;
3266 i = (mz=my*my) >> 21;
3267 for(mz=0x60000000-(((mz>>i)*mx)>>(expx-2*expy-i)); mz<0x40000000; mz<<=1,--expy) ;
3268 i = (my*=(mz>>10)+1) >> 31;
3269 return half(
detail::binary, detail::fixed2half<half::round_style,30,false,false,true>(my>>i, expy+i+14));
3283 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
3286 int abs = arg.data_ & 0x7FFF,
exp = -15;
3287 if(!
abs ||
abs == 0x3C00 ||
abs >= 0x7C00)
3291 (((ilog<<27)+(detail::log2(static_cast<detail::uint32>((
abs&0x3FF)|0x400)<<20, 24)>>4))^sign) - sign;
3292 for(
exp=2; m<0x80000000; m<<=1,--
exp) ;
3304 f = (m<<
exp) & 0x7FFFFFFF;
3307 m =
detail::exp2(f, (half::round_style==std::round_to_nearest) ? 29 : 26);
3318 detail::fixed2half<half::round_style,31,false,false,false>(m,
exp+14, arg.data_&0x8000) :
3319 detail::fixed2half<half::round_style,23,false,false,false>((m+0x80)>>8,
exp+14, arg.data_&0x8000));
3334 #ifdef HALF_ARITHMETIC_TYPE
3335 detail::internal_t fx = detail::half2float<detail::internal_t>(x.data_), fy = detail::half2float<detail::internal_t>(y.data_);
3336 #if HALF_ENABLE_CPP11_CMATH
3342 int absx = x.data_ & 0x7FFF, absy = y.data_ & 0x7FFF, expx = 0, expy = 0;
3343 if(absx >= 0x7C00 || absy >= 0x7C00)
3352 for(; absx<0x400; absx<<=1,--expx) ;
3353 for(; absy<0x400; absy<<=1,--expy) ;
3354 detail::uint32 mx = (absx&0x3FF) | 0x400, my = (absy&0x3FF) | 0x400;
3357 int ix = mx >> 21, iy = my >> 21;
3358 expx = 2*(expx+(absx>>10)) - 15 + ix;
3359 expy = 2*(expy+(absy>>10)) - 15 + iy;
3362 int d = expx - expy;
3363 my = (d<30) ? ((my>>d)|((my&((
static_cast<detail::uint32>(1)<<d)-1))!=0)) : 1;
3380 #ifdef HALF_ARITHMETIC_TYPE
3381 detail::internal_t fx = detail::half2float<detail::internal_t>(x.data_), fy = detail::half2float<detail::internal_t>(y.data_), fz = detail::half2float<detail::internal_t>(z.data_);
3384 int absx = x.data_ & 0x7FFF, absy = y.data_ & 0x7FFF, absz = z.data_ & 0x7FFF, expx = 0, expy = 0, expz = 0;
3391 if(absx >= 0x7C00 || absy >= 0x7C00 || absz >= 0x7C00)
3402 for(; absx<0x400; absx<<=1,--expx) ;
3403 for(; absy<0x400; absy<<=1,--expy) ;
3404 for(; absz<0x400; absz<<=1,--expz) ;
3405 detail::uint32 mx = (absx&0x3FF) | 0x400, my = (absy&0x3FF) | 0x400, mz = (absz&0x3FF) | 0x400;
3409 int ix = mx >> 21, iy = my >> 21, iz = mz >> 21;
3410 expx = 2*(expx+(absx>>10)) - 15 + ix;
3411 expy = 2*(expy+(absy>>10)) - 15 + iy;
3412 expz = 2*(expz+(absz>>10)) - 15 + iz;
3416 int d = expy - expz;
3417 mz = (d<30) ? ((mz>>d)|((mz&((
static_cast<detail::uint32>(1)<<d)-1))!=0)) : 1;
3421 my = (my>>1) | (my&1);
3429 my = (d<30) ? ((my>>d)|((my&((
static_cast<detail::uint32>(1)<<d)-1))!=0)) : 1;
3446 #ifdef HALF_ARITHMETIC_TYPE
3447 return half(
detail::binary, detail::float2half<half::round_style>(
std::pow(detail::half2float<detail::internal_t>(x.data_), detail::half2float<detail::internal_t>(y.data_))));
3449 int absx = x.data_ & 0x7FFF, absy = y.data_ & 0x7FFF,
exp = -15;
3450 if(!absy || x.data_ == 0x3C00)
3452 bool is_int = absy >= 0x6400 || (absy>=0x3C00 && !(absy&((1<<(25-(absy>>10)))-1)));
3453 unsigned int sign = x.data_ & (
static_cast<unsigned>((absy<0x6800)&&is_int&&((absy>>(25-(absy>>10)))&1))<<15);
3454 if(absx >= 0x7C00 || absy >= 0x7C00)
3456 (absy==0x7C00) ? ((absx==0x3C00) ? 0x3C00 : (!absx && y.data_==0xFC00) ?
detail::pole() :
3457 (0x7C00&-((y.data_>>15)^(absx>0x3C00)))) : (sign|(0x7C00&((y.data_>>15)-1U))));
3460 if((x.data_&0x8000) && !is_int)
3462 if(x.data_ == 0xBC00)
3466 case 0x3800:
return sqrt(x);
3468 case 0x4000:
return x * x;
3471 for(; absx<0x400; absx<<=1,--
exp) ;
3473 (((ilog<<27)+((detail::log2(static_cast<detail::uint32>((absx&0x3FF)|0x400)<<20)+8)>>4))^msign) - msign;
3474 for(
exp=-11; m<0x80000000; m<<=1,--
exp) ;
3475 for(; absy<0x400; absy<<=1,--
exp) ;
3478 exp += (absy>>10) + i;
3487 f = (m<<
exp) & 0x7FFFFFFF;
3490 return half(
detail::binary, detail::exp2_post<half::round_style>(f,
exp, ((msign&1)^(y.data_>>15))!=0, sign));
3510 #ifdef HALF_ARITHMETIC_TYPE
3511 detail::internal_t f = detail::half2float<detail::internal_t>(arg.data_);
3515 int abs = arg.data_ & 0x7FFF, sign = arg.data_ >> 15, k;
3523 else if(
abs < 0x2500)
3530 if(half::round_style != std::round_to_nearest)
3535 *
sin =
half(
detail::binary, detail::rounded<half::round_style,true>((~arg.data_&0x8000)|0x1D07, 1, 1));
3539 *
sin =
half(
detail::binary, detail::rounded<half::round_style,true>((arg.data_&0x8000)|0x3BFF, 1, 1));
3543 *
sin =
half(
detail::binary, detail::rounded<half::round_style,true>((~arg.data_&0x8000)|0x3BFE, 1, 1));
3547 *
sin =
half(
detail::binary, detail::rounded<half::round_style,true>((arg.data_&0x8000)|0x0FE6, 1, 1));
3555 case 1: sc = std::make_pair(sc.second, -sc.first);
break;
3556 case 2: sc = std::make_pair(-sc.first, -sc.second);
break;
3557 case 3: sc = std::make_pair(-sc.second, sc.first);
break;
3575 #ifdef HALF_ARITHMETIC_TYPE
3576 return half(
detail::binary, detail::float2half<half::round_style>(
std::sin(detail::half2float<detail::internal_t>(arg.data_))));
3578 int abs = arg.data_ & 0x7FFF, k;
3584 return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_-1, 1, 1));
3585 if(half::round_style != std::round_to_nearest)
3588 case 0x48B7:
return half(
detail::binary, detail::rounded<half::round_style,true>((~arg.data_&0x8000)|0x1D07, 1, 1));
3589 case 0x6A64:
return half(
detail::binary, detail::rounded<half::round_style,true>((~arg.data_&0x8000)|0x3BFE, 1, 1));
3590 case 0x6D8C:
return half(
detail::binary, detail::rounded<half::round_style,true>((arg.data_&0x8000)|0x0FE6, 1, 1));
3594 return half(
detail::binary, detail::fixed2half<half::round_style,30,true,true,true>((((k&1) ? sc.second : sc.first)^sign) - sign));
3608 #ifdef HALF_ARITHMETIC_TYPE
3609 return half(
detail::binary, detail::float2half<half::round_style>(
std::cos(detail::half2float<detail::internal_t>(arg.data_))));
3611 int abs = arg.data_ & 0x7FFF, k;
3618 if(half::round_style != std::round_to_nearest &&
abs == 0x598C)
3622 return half(
detail::binary, detail::fixed2half<half::round_style,30,true,true,true>((((k&1) ? sc.first : sc.second)^sign) - sign));
3636 #ifdef HALF_ARITHMETIC_TYPE
3637 return half(
detail::binary, detail::float2half<half::round_style>(
std::tan(detail::half2float<detail::internal_t>(arg.data_))));
3639 int abs = arg.data_ & 0x7FFF,
exp = 13, k;
3645 return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_, 0, 1));
3646 if(half::round_style != std::round_to_nearest)
3649 case 0x658C:
return half(
detail::binary, detail::rounded<half::round_style,true>((arg.data_&0x8000)|0x07E6, 1, 1));
3650 case 0x7330:
return half(
detail::binary, detail::rounded<half::round_style,true>((~arg.data_&0x8000)|0x4B62, 1, 1));
3654 sc = std::make_pair(-sc.second, sc.first);
3656 detail::uint32 my = (sc.first^signy) - signy, mx = (sc.second^signx) - signx;
3657 for(; my<0x80000000; my<<=1,--
exp) ;
3658 for(; mx<0x80000000; mx<<=1,++
exp) ;
3659 return half(
detail::binary, detail::tangent_post<half::round_style>(my, mx,
exp, (signy^signx^arg.data_)&0x8000));
3673 #ifdef HALF_ARITHMETIC_TYPE
3676 unsigned int abs = arg.data_ & 0x7FFF, sign = arg.data_ & 0x8000;
3681 detail::rounded<half::round_style,true>(sign|0x3E48, 0, 1));
3683 return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_, 0, 1));
3684 if(half::round_style != std::round_to_nearest && (
abs == 0x2B44 ||
abs == 0x2DC3))
3685 return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_+1, 1, 1));
3688 return half(
detail::binary, detail::fixed2half<half::round_style,30,false,true,true>(m, 14, sign));
3702 #ifdef HALF_ARITHMETIC_TYPE
3705 unsigned int abs = arg.data_ & 0x7FFF, sign = arg.data_ >> 15;
3710 sign ? detail::rounded<half::round_style,true>(0x4248, 0, 1) : 0);
3713 return half(
detail::binary, detail::fixed2half<half::round_style,31,false,true,true>(sign ? (0xC90FDAA2-m) : m, 15, 0, sign));
3727 #ifdef HALF_ARITHMETIC_TYPE
3730 unsigned int abs = arg.data_ & 0x7FFF, sign = arg.data_ & 0x8000;
3736 return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_-1, 1, 1));
3740 detail::atan2(my<<(
exp+4), 0x20000000, (half::round_style==std::round_to_nearest) ? 30 : 28);
3741 return half(
detail::binary, detail::fixed2half<half::round_style,30,false,true,true>(m, 14, sign));
3757 #ifdef HALF_ARITHMETIC_TYPE
3758 return half(
detail::binary, detail::float2half<half::round_style>(
std::atan2(detail::half2float<detail::internal_t>(y.data_), detail::half2float<detail::internal_t>(x.data_))));
3760 unsigned int absx = x.data_ & 0x7FFF, absy = y.data_ & 0x7FFF, signx = x.data_ >> 15, signy = y.data_ & 0x8000;
3761 if(absx >= 0x7C00 || absy >= 0x7C00)
3763 if(absx > 0x7C00 || absy > 0x7C00)
3766 return half(
detail::binary, (absx<0x7C00) ? detail::rounded<half::round_style,true>(signy|0x3E48, 0, 1) :
3767 signx ? detail::rounded<half::round_style,true>(signy|0x40B6, 0, 1) :
3768 detail::rounded<half::round_style,true>(signy|0x3A48, 0, 1));
3772 return signx ?
half(
detail::binary, detail::rounded<half::round_style,true>(signy|0x4248, 0, 1)) : y;
3774 return half(
detail::binary, detail::rounded<half::round_style,true>(signy|0x3E48, 0, 1));
3775 int d = (absy>>10) + (absy<=0x3FF) - (absx>>10) - (absx<=0x3FF);
3776 if(d > (signx ? 18 : 12))
3777 return half(
detail::binary, detail::rounded<half::round_style,true>(signy|0x3E48, 0, 1));
3778 if(signx && d < -11)
3779 return half(
detail::binary, detail::rounded<half::round_style,true>(signy|0x4248, 0, 1));
3780 if(!signx && d < ((half::round_style==std::round_toward_zero) ? -15 : -9))
3782 for(; absy<0x400; absy<<=1,--d) ;
3783 detail::uint32 mx = ((absx<<1)&0x7FF) | 0x800, my = ((absy<<1)&0x7FF) | 0x800;
3789 return half(
detail::binary, detail::fixed2half<half::round_style,11,false,false,true>(my/mx, d+14, signy, my%mx!=0));
3792 ((absx&0x3FF)|((absx>0x3FF)<<10))<<(19-((d>0) ? d : (d<0) ? 0 : 1)));
3793 return half(
detail::binary, detail::fixed2half<half::round_style,31,false,true,true>(signx ? (0xC90FDAA2-m) : m, 15, signy, signx));
3812 #ifdef HALF_ARITHMETIC_TYPE
3815 int abs = arg.data_ & 0x7FFF,
exp;
3816 if(!
abs ||
abs >= 0x7C00)
3819 return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_, 0, 1));
3822 for(
exp+=13; m<0x80000000 &&
exp; m<<=1,--
exp) ;
3823 unsigned int sign = arg.data_ & 0x8000;
3826 return half(
detail::binary, detail::fixed2half<half::round_style,31,false,false,true>(m,
exp, sign));
3840 #ifdef HALF_ARITHMETIC_TYPE
3843 int abs = arg.data_ & 0x7FFF,
exp;
3849 detail::uint32 m = mm.first + mm.second, i = (~m&0xFFFFFFFF) >> 31;
3850 m = (m>>i) | (m&i) | 0x80000000;
3851 if((
exp+=13+i) > 29)
3867 #ifdef HALF_ARITHMETIC_TYPE
3870 int abs = arg.data_ & 0x7FFF,
exp;
3876 return half(
detail::binary, detail::rounded<half::round_style,true>((arg.data_&0x8000)|0x3BFF, 1, 1));
3878 return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_-1, 1, 1));
3879 if(half::round_style != std::round_to_nearest &&
abs == 0x2D3F)
3880 return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_-3, 0, 1));
3882 detail::uint32 my = mm.first - mm.second - (half::round_style!=std::round_to_nearest), mx = mm.first + mm.second, i = (~mx&0xFFFFFFFF) >> 31;
3883 for(
exp=13; my<0x80000000; my<<=1,--
exp) ;
3884 mx = (mx>>i) | 0x80000000;
3885 return half(
detail::binary, detail::tangent_post<half::round_style>(my, mx,
exp-i, arg.data_&0x8000));
3899 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
3902 int abs = arg.data_ & 0x7FFF;
3903 if(!
abs ||
abs >= 0x7C00)
3906 return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_-1, 1, 1));
3907 if(half::round_style != std::round_to_nearest)
3910 case 0x32D4:
return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_-13, 1, 1));
3911 case 0x3B5B:
return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_-197, 1, 1));
3927 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
3930 int abs = arg.data_ & 0x7FFF;
3931 if((arg.data_&0x8000) ||
abs < 0x3C00)
3935 if(arg.data_ >= 0x7C00)
3952 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
3955 int abs = arg.data_ & 0x7FFF,
exp = 0;
3961 return half(
detail::binary, detail::rounded<half::round_style,true>(arg.data_, 0, 1));
3963 for(; mx<0x80000000; mx<<=1,++
exp) ;
3964 int i = my >= mx, s;
3985 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
3986 return half(
detail::binary, detail::float2half<half::round_style>(
std::erf(detail::half2float<detail::internal_t>(arg.data_))));
3988 unsigned int abs = arg.data_ & 0x7FFF;
3989 if(!
abs ||
abs >= 0x7C00)
3992 return half(
detail::binary, detail::rounded<half::round_style,true>((arg.data_&0x8000)|0x3BFF, 1, 1));
4007 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
4010 unsigned int abs = arg.data_ & 0x7FFF, sign = arg.data_ & 0x8000;
4016 return half(
detail::binary, detail::rounded<half::round_style,true>((sign>>1)-(sign>>15), sign>>15, 1));
4032 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
4035 int abs = arg.data_ & 0x7FFF;
4038 if(!
abs || arg.data_ >= 0xE400 || (arg.data_ >= 0xBC00 && !(
abs&((1<<(25-(
abs>>10)))-1))))
4040 if(arg.data_ == 0x3C00 || arg.data_ == 0x4000)
4057 #if defined(HALF_ARITHMETIC_TYPE) && HALF_ENABLE_CPP11_CMATH
4060 unsigned int abs = arg.data_ & 0x7FFF;
4065 if(arg.data_ >= 0xE400 || (arg.data_ >= 0xBC00 && !(
abs&((1<<(25-(
abs>>10)))-1))))
4067 if(arg.data_ >= 0xCA80)
4069 if(arg.data_ <= 0x100 || (arg.data_ >= 0x4900 && arg.data_ < 0x8000))
4071 if(arg.data_ == 0x3C00)
4119 inline long lround(
half arg) {
return detail::half2int<std::round_to_nearest,false,false,long>(arg.data_); }
4135 inline long lrint(
half arg) {
return detail::half2int<half::round_style,true,true,long>(arg.data_); }
4143 #if HALF_ENABLE_CPP11_LONG_LONG
4144 inline long long llround(half arg) {
return detail::half2int<std::round_to_nearest,false,false,long long>(arg.data_); }
4157 inline long long llrint(half arg) {
return detail::half2int<half::round_style,true,true,long long>(arg.data_); }
4174 unsigned int abs = arg.data_ & 0x7FFF;
4175 if(
abs >= 0x7C00 || !
abs)
4193 unsigned int abs = arg.data_ & 0x7FFF, sign = arg.data_ & 0x8000;
4194 if(
abs >= 0x7C00 || !
abs)
4204 unsigned int m = (
abs&0x3FF) | 0x400;
4238 unsigned int abs = arg.data_ & 0x7FFF;
4242 return *iptr = arg, arg;
4247 return iptr->data_ = arg.data_ & 0x8000, arg;
4248 unsigned int exp =
abs >> 10, mask = (1<<(25-
exp)) - 1, m = arg.data_ & mask;
4249 iptr->data_ = arg.data_ & ~mask;
4252 for(; m<0x400; m<<=1,--
exp) ;
4266 int abs = arg.data_ & 0x7FFF,
exp;
4267 if(!
abs ||
abs >= 0x7C00)
4284 int abs = arg.data_ & 0x7FFF,
exp;
4290 unsigned int value =
static_cast<unsigned>(
exp<0) << 15;
4294 for(
exp=18; m<0x400; m<<=1,--
exp) ;
4295 value |= (
exp<<10) + m;
4310 int fabs = from.data_ & 0x7FFF, tabs = to.data_ & 0x7FFF;
4311 if(
fabs > 0x7C00 || tabs > 0x7C00)
4313 if(from.data_ == to.data_ || !(
fabs|tabs))
4320 unsigned int out = from.data_ + (((from.data_>>15)^
static_cast<unsigned>(
4321 (from.data_^(0x8000|(0x8000-(from.data_>>15))))<(to.data_^(0x8000|(0x8000-(to.data_>>15))))))<<1) - 1;
4337 int fabs = from.data_ & 0x7FFF;
4340 long double lfrom =
static_cast<long double>(from);
4342 return half(
static_cast<float>(to));
4348 unsigned int out = from.data_ + (((from.data_>>15)^
static_cast<unsigned>(lfrom<to))<<1) - 1;
4376 return !(arg.data_&0x7FFF) ?
FP_ZERO :
4378 ((arg.data_&0x7FFF)<0x7C00) ?
FP_NORMAL :
4431 return ((x.data_^(0x8000|(0x8000-(x.data_>>15))))+(x.data_>>15)) > ((y.data_^(0x8000|(0x8000-(y.data_>>15))))+(y.data_>>15)) && !
isnan(x) && !
isnan(y);
4442 return ((x.data_^(0x8000|(0x8000-(x.data_>>15))))+(x.data_>>15)) >= ((y.data_^(0x8000|(0x8000-(y.data_>>15))))+(y.data_>>15)) && !
isnan(x) && !
isnan(y);
4453 return ((x.data_^(0x8000|(0x8000-(x.data_>>15))))+(x.data_>>15)) < ((y.data_^(0x8000|(0x8000-(y.data_>>15))))+(y.data_>>15)) && !
isnan(x) && !
isnan(y);
4464 return ((x.data_^(0x8000|(0x8000-(x.data_>>15))))+(x.data_>>15)) <= ((y.data_^(0x8000|(0x8000-(y.data_>>15))))+(y.data_>>15)) && !
isnan(x) && !
isnan(y);
4475 return x.data_!=y.data_ && ((x.data_|y.data_)&0x7FFF) && !
isnan(x) && !
isnan(y);
4593 throw std::domain_error(msg);
4595 throw std::overflow_error(msg);
4597 throw std::underflow_error(msg);
4599 throw std::range_error(msg);
4605 #undef HALF_UNUSED_NOERR
4606 #undef HALF_CONSTEXPR
4607 #undef HALF_CONSTEXPR_CONST
4608 #undef HALF_CONSTEXPR_NOERR
4609 #undef HALF_NOEXCEPT
4611 #undef HALF_THREAD_LOCAL
4612 #undef HALF_TWOS_COMPLEMENT_INT
4613 #ifdef HALF_POP_WARNINGS
4614 #pragma warning(pop)
4615 #undef HALF_POP_WARNINGS