26 #define HALF_GNUC_VERSION (__GNUC__*100+__GNUC_MINOR__)
29 #if defined(__clang__) //clang
30 #if __has_feature(cxx_static_assert) && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
31 #define HALF_ENABLE_CPP11_STATIC_ASSERT 1
33 #if __has_feature(cxx_constexpr) && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
34 #define HALF_ENABLE_CPP11_CONSTEXPR 1
36 #if __has_feature(cxx_noexcept) && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
37 #define HALF_ENABLE_CPP11_NOEXCEPT 1
39 #if __has_feature(cxx_user_literals) && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
40 #define HALF_ENABLE_CPP11_USER_LITERALS 1
42 #if (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L) && !defined(HALF_ENABLE_CPP11_LONG_LONG)
43 #define HALF_ENABLE_CPP11_LONG_LONG 1
58 #elif defined(__GNUC__) //gcc
59 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
60 #if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
61 #define HALF_ENABLE_CPP11_STATIC_ASSERT 1
63 #if HALF_GNUC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
64 #define HALF_ENABLE_CPP11_CONSTEXPR 1
66 #if HALF_GNUC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
67 #define HALF_ENABLE_CPP11_NOEXCEPT 1
69 #if HALF_GNUC_VERSION >= 407 && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
70 #define HALF_ENABLE_CPP11_USER_LITERALS 1
72 #if !defined(HALF_ENABLE_CPP11_LONG_LONG)
73 #define HALF_ENABLE_CPP11_LONG_LONG 1
76 #elif defined(_MSC_VER) //Visual C++
77 #if _MSC_VER >= 1600 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
78 #define HALF_ENABLE_CPP11_STATIC_ASSERT 1
80 #if _MSC_VER >= 1310 && !defined(HALF_ENABLE_CPP11_LONG_LONG)
81 #define HALF_ENABLE_CPP11_LONG_LONG 1
83 #define HALF_POP_WARNINGS 1
85 #pragma warning(disable : 4099 4127 4146) //struct vs class, constant in if, negative unsigned
90 #if defined(_LIBCPP_VERSION) //libc++
91 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103
92 #ifndef HALF_ENABLE_CPP11_TYPE_TRAITS
93 #define HALF_ENABLE_CPP11_TYPE_TRAITS 1
95 #ifndef HALF_ENABLE_CPP11_CSTDINT
96 #define HALF_ENABLE_CPP11_CSTDINT 1
98 #ifndef HALF_ENABLE_CPP11_CMATH
99 #define HALF_ENABLE_CPP11_CMATH 1
101 #ifndef HALF_ENABLE_CPP11_HASH
102 #define HALF_ENABLE_CPP11_HASH 1
105 #elif defined(__GLIBCXX__) //libstdc++
106 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103
108 #if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_TYPE_TRAITS)
109 #define HALF_ENABLE_CPP11_TYPE_TRAITS 1
111 #if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CSTDINT)
112 #define HALF_ENABLE_CPP11_CSTDINT 1
114 #if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CMATH)
115 #define HALF_ENABLE_CPP11_CMATH 1
117 #if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_HASH)
118 #define HALF_ENABLE_CPP11_HASH 1
121 #if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CSTDINT)
122 #define HALF_ENABLE_CPP11_CSTDINT 1
124 #if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CMATH)
125 #define HALF_ENABLE_CPP11_CMATH 1
127 #if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_HASH)
128 #define HALF_ENABLE_CPP11_HASH 1
132 #elif defined(_CPPLIB_VER) //Dinkumware/Visual C++
133 #if _CPPLIB_VER >= 520
134 #ifndef HALF_ENABLE_CPP11_TYPE_TRAITS
135 #define HALF_ENABLE_CPP11_TYPE_TRAITS 1
137 #ifndef HALF_ENABLE_CPP11_CSTDINT
138 #define HALF_ENABLE_CPP11_CSTDINT 1
140 #ifndef HALF_ENABLE_CPP11_HASH
141 #define HALF_ENABLE_CPP11_HASH 1
144 #if _CPPLIB_VER >= 610
145 #ifndef HALF_ENABLE_CPP11_CMATH
146 #define HALF_ENABLE_CPP11_CMATH 1
150 #undef HALF_GNUC_VERSION
153 #if defined(__DREAMCAST__) || defined(__PSP__)
154 #undef HALF_ENABLE_CPP11_CMATH
155 #define HALF_ENABLE_CPP11_CMATH 0
160 #if HALF_ENABLE_CPP11_CONSTEXPR
161 #define HALF_CONSTEXPR constexpr
162 #define HALF_CONSTEXPR_CONST constexpr
164 #define HALF_CONSTEXPR
165 #define HALF_CONSTEXPR_CONST const
169 #if HALF_ENABLE_CPP11_NOEXCEPT
170 #define HALF_NOEXCEPT noexcept
171 #define HALF_NOTHROW noexcept
173 #define HALF_NOEXCEPT
174 #define HALF_NOTHROW throw()
183 #if HALF_ENABLE_CPP11_TYPE_TRAITS
184 #include <type_traits>
186 #if HALF_ENABLE_CPP11_CSTDINT
189 #if HALF_ENABLE_CPP11_HASH
190 #include <functional>
210 #ifndef HALF_ROUND_STYLE
211 #define HALF_ROUND_STYLE -1 // = std::round_indeterminate
219 #ifndef HALF_ROUND_TIES_TO_EVEN
220 #define HALF_ROUND_TIES_TO_EVEN 0 // ties away from zero
226 #define HUGE_VALH std::numeric_limits<half_float::half>::infinity()
232 #define FP_FAST_FMAH 1
235 #define FP_ILOGB0 INT_MIN
238 #define FP_ILOGBNAN INT_MAX
241 #define FP_SUBNORMAL 0
250 #define FP_INFINITE 3
267 #if HALF_ENABLE_CPP11_TYPE_TRAITS
268 template<
bool B,
typename T,
typename F>
struct conditional : std::conditional<B,T,F> {};
272 template<
bool B>
struct bool_type : std::integral_constant<bool,B> {};
273 using std::true_type;
274 using std::false_type;
277 template<
typename T>
struct is_float : std::is_floating_point<T> {};
279 template<
bool,
typename T,
typename>
struct conditional {
typedef T type; };
281 template<
typename T,
typename F>
struct conditional<false,T,F> {
typedef F type; };
298 #if HALF_ENABLE_CPP11_CSTDINT
299 typedef std::uint_least16_t
uint16;
303 typedef std::uint_least32_t uint32;
306 typedef std::int_fast32_t int17;
308 typedef unsigned short uint16;
330 explicit HALF_CONSTEXPR
expr(
float f) : value_(f) {}
334 HALF_CONSTEXPR
operator float()
const {
return value_; }
345 template<
typename T,
typename,
typename=
void,
typename=
void>
struct enable {};
346 template<
typename T>
struct enable<T,
half,void,void> {
typedef T type; };
347 template<
typename T>
struct enable<T,
expr,void,void> {
typedef T type; };
379 #if HALF_ENABLE_CPP11_CMATH
380 return std::isinf(arg);
381 #elif defined(_MSC_VER)
382 return !_finite(
static_cast<double>(arg)) && !_isnan(
static_cast<double>(arg));
384 return arg == std::numeric_limits<T>::infinity() || arg == -std::numeric_limits<T>::infinity();
395 #if HALF_ENABLE_CPP11_CMATH
396 return std::isnan(arg);
397 #elif defined(_MSC_VER)
398 return _isnan(
static_cast<double>(arg)) != 0;
411 #if HALF_ENABLE_CPP11_CMATH
412 return std::signbit(arg);
414 return arg < T() || (arg == T() && T(1)/arg < T());
429 #if HALF_ENABLE_CPP11_STATIC_ASSERT
430 static_assert(std::numeric_limits<float>::is_iec559,
"float to half conversion needs IEEE 754 conformant 'float' type");
431 static_assert(
sizeof(uint32)==
sizeof(
float),
"float to half conversion needs unsigned integer type of exactly the size of a 'float'");
433 static const uint16 base_table[512] = {
434 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
435 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
436 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
437 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
438 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
439 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
440 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100,
441 0x0200, 0x0400, 0x0800, 0x0C00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x2400, 0x2800, 0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00,
442 0x4000, 0x4400, 0x4800, 0x4C00, 0x5000, 0x5400, 0x5800, 0x5C00, 0x6000, 0x6400, 0x6800, 0x6C00, 0x7000, 0x7400, 0x7800, 0x7C00,
443 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
444 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
445 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
446 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
447 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
448 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
449 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
450 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
451 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
452 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
453 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
454 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
455 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
456 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001, 0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100,
457 0x8200, 0x8400, 0x8800, 0x8C00, 0x9000, 0x9400, 0x9800, 0x9C00, 0xA000, 0xA400, 0xA800, 0xAC00, 0xB000, 0xB400, 0xB800, 0xBC00,
458 0xC000, 0xC400, 0xC800, 0xCC00, 0xD000, 0xD400, 0xD800, 0xDC00, 0xE000, 0xE400, 0xE800, 0xEC00, 0xF000, 0xF400, 0xF800, 0xFC00,
459 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
460 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
461 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
462 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
463 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
464 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
465 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00 };
466 static const unsigned char shift_table[512] = {
467 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
468 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
469 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
470 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,
471 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,
472 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
473 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
474 24, 24, 24, 24, 24, 24, 24, 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,
475 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
476 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
477 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
478 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,
479 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,
480 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
481 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
482 24, 24, 24, 24, 24, 24, 24, 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 };
484 std::memcpy(&bits, &value,
sizeof(
float));
485 uint16 hbits = base_table[bits>>23] +
static_cast<uint16>((bits&0x7FFFFF)>>shift_table[bits>>23]);
486 if(R == std::round_to_nearest)
487 hbits += (((bits&0x7FFFFF)>>(shift_table[bits>>23]-1))|(((bits>>23)&0xFF)==102)) & ((hbits&0x7C00)!=0x7C00)
489 & (((((
static_cast<uint32
>(1)<<(shift_table[bits>>23]-1))-1)&bits)!=0)|hbits)
492 else if(R == std::round_toward_zero)
493 hbits -= ((hbits&0x7FFF)==0x7C00) & ~shift_table[bits>>23];
494 else if(R == std::round_toward_infinity)
495 hbits += ((((bits&0x7FFFFF&((
static_cast<uint32
>(1)<<(shift_table[bits>>23]))-1))!=0)|(((bits>>23)<=102)&
496 ((bits>>23)!=0)))&(hbits<0x7C00)) - ((hbits==0xFC00)&((bits>>23)!=511));
497 else if(R == std::round_toward_neg_infinity)
498 hbits += ((((bits&0x7FFFFF&((
static_cast<uint32
>(1)<<(shift_table[bits>>23]))-1))!=0)|(((bits>>23)<=358)&
499 ((bits>>23)!=256)))&(hbits<0xFC00)&(hbits>>15)) - ((hbits==0x7C00)&((bits>>23)!=255));
512 return hbits | 0x7FFF;
514 return hbits | 0x7C00;
516 std::frexp(value, &
exp);
519 if(R == std::round_toward_zero)
520 return hbits | 0x7BFF;
521 else if(R == std::round_toward_infinity)
522 return hbits | 0x7C00 - (hbits>>15);
523 else if(R == std::round_toward_neg_infinity)
524 return hbits | 0x7BFF + (hbits>>15);
525 return hbits | 0x7C00;
528 value = std::ldexp(value, 24);
531 value = std::ldexp(value, 11-
exp);
532 hbits |= ((
exp+14)<<10);
534 int ival =
static_cast<int>(value);
535 hbits |=
static_cast<uint16>(std::abs(ival)&0x3FF);
536 if(R == std::round_to_nearest)
538 float diff = std::abs(value-
static_cast<float>(ival));
539 #if HALF_ROUND_TIES_TO_EVEN
540 hbits += (diff>0.5f) | ((diff==0.5f)&hbits);
542 hbits += diff >= 0.5f;
545 else if(R == std::round_toward_infinity)
546 hbits += value >
static_cast<float>(ival);
547 else if(R == std::round_toward_neg_infinity)
548 hbits += value < static_cast<float>(ival);
557 return float2half_impl<R>(value,
bool_type<std::numeric_limits<float>::is_iec559&&
sizeof(uint32)==
sizeof(
float)>());
573 if(R == std::round_toward_infinity)
575 else if(R == std::round_toward_neg_infinity)
578 bits |= 0x7BFF + (R!=std::round_toward_zero);
582 unsigned int m = value,
exp = 25;
583 for(; m<0x400; m<<=1,--
exp) ;
584 for(; m>0x7FF; m>>=1,++
exp) ;
585 bits |= (
exp<<10) | (m&0x3FF);
588 if(R == std::round_to_nearest)
589 bits += (value>>(
exp-26)) & 1
590 #if HALF_ROUND_TIES_TO_EVEN
591 & (((((1<<(
exp-26))-1)&value)!=0)|bits)
594 else if(R == std::round_toward_infinity)
595 bits += ((value&((1<<(
exp-25))-1))!=0) & !S;
596 else if(R == std::round_toward_neg_infinity)
597 bits += ((value&((1<<(
exp-25))-1))!=0) & S;
610 return (value<0) ? int2half_impl<R,true>(value) : int2half_impl<R,false>(value);
619 #if HALF_ENABLE_CPP11_STATIC_ASSERT
620 static_assert(std::numeric_limits<float>::is_iec559,
"half to float conversion needs IEEE 754 conformant 'float' type");
621 static_assert(
sizeof(uint32)==
sizeof(
float),
"half to float conversion needs unsigned integer type of exactly the size of a 'float'");
623 static const uint32 mantissa_table[2048] = {
624 0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34A00000, 0x34C00000, 0x34E00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000, 0x35400000, 0x35500000, 0x35600000, 0x35700000,
625 0x35800000, 0x35880000, 0x35900000, 0x35980000, 0x35A00000, 0x35A80000, 0x35B00000, 0x35B80000, 0x35C00000, 0x35C80000, 0x35D00000, 0x35D80000, 0x35E00000, 0x35E80000, 0x35F00000, 0x35F80000,
626 0x36000000, 0x36040000, 0x36080000, 0x360C0000, 0x36100000, 0x36140000, 0x36180000, 0x361C0000, 0x36200000, 0x36240000, 0x36280000, 0x362C0000, 0x36300000, 0x36340000, 0x36380000, 0x363C0000,
627 0x36400000, 0x36440000, 0x36480000, 0x364C0000, 0x36500000, 0x36540000, 0x36580000, 0x365C0000, 0x36600000, 0x36640000, 0x36680000, 0x366C0000, 0x36700000, 0x36740000, 0x36780000, 0x367C0000,
628 0x36800000, 0x36820000, 0x36840000, 0x36860000, 0x36880000, 0x368A0000, 0x368C0000, 0x368E0000, 0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369A0000, 0x369C0000, 0x369E0000,
629 0x36A00000, 0x36A20000, 0x36A40000, 0x36A60000, 0x36A80000, 0x36AA0000, 0x36AC0000, 0x36AE0000, 0x36B00000, 0x36B20000, 0x36B40000, 0x36B60000, 0x36B80000, 0x36BA0000, 0x36BC0000, 0x36BE0000,
630 0x36C00000, 0x36C20000, 0x36C40000, 0x36C60000, 0x36C80000, 0x36CA0000, 0x36CC0000, 0x36CE0000, 0x36D00000, 0x36D20000, 0x36D40000, 0x36D60000, 0x36D80000, 0x36DA0000, 0x36DC0000, 0x36DE0000,
631 0x36E00000, 0x36E20000, 0x36E40000, 0x36E60000, 0x36E80000, 0x36EA0000, 0x36EC0000, 0x36EE0000, 0x36F00000, 0x36F20000, 0x36F40000, 0x36F60000, 0x36F80000, 0x36FA0000, 0x36FC0000, 0x36FE0000,
632 0x37000000, 0x37010000, 0x37020000, 0x37030000, 0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000, 0x370A0000, 0x370B0000, 0x370C0000, 0x370D0000, 0x370E0000, 0x370F0000,
633 0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000, 0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371A0000, 0x371B0000, 0x371C0000, 0x371D0000, 0x371E0000, 0x371F0000,
634 0x37200000, 0x37210000, 0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000, 0x37280000, 0x37290000, 0x372A0000, 0x372B0000, 0x372C0000, 0x372D0000, 0x372E0000, 0x372F0000,
635 0x37300000, 0x37310000, 0x37320000, 0x37330000, 0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000, 0x373A0000, 0x373B0000, 0x373C0000, 0x373D0000, 0x373E0000, 0x373F0000,
636 0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000, 0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374A0000, 0x374B0000, 0x374C0000, 0x374D0000, 0x374E0000, 0x374F0000,
637 0x37500000, 0x37510000, 0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000, 0x37580000, 0x37590000, 0x375A0000, 0x375B0000, 0x375C0000, 0x375D0000, 0x375E0000, 0x375F0000,
638 0x37600000, 0x37610000, 0x37620000, 0x37630000, 0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000, 0x376A0000, 0x376B0000, 0x376C0000, 0x376D0000, 0x376E0000, 0x376F0000,
639 0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000, 0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377A0000, 0x377B0000, 0x377C0000, 0x377D0000, 0x377E0000, 0x377F0000,
640 0x37800000, 0x37808000, 0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000, 0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000, 0x37870000, 0x37878000,
641 0x37880000, 0x37888000, 0x37890000, 0x37898000, 0x378A0000, 0x378A8000, 0x378B0000, 0x378B8000, 0x378C0000, 0x378C8000, 0x378D0000, 0x378D8000, 0x378E0000, 0x378E8000, 0x378F0000, 0x378F8000,
642 0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000, 0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000, 0x37960000, 0x37968000, 0x37970000, 0x37978000,
643 0x37980000, 0x37988000, 0x37990000, 0x37998000, 0x379A0000, 0x379A8000, 0x379B0000, 0x379B8000, 0x379C0000, 0x379C8000, 0x379D0000, 0x379D8000, 0x379E0000, 0x379E8000, 0x379F0000, 0x379F8000,
644 0x37A00000, 0x37A08000, 0x37A10000, 0x37A18000, 0x37A20000, 0x37A28000, 0x37A30000, 0x37A38000, 0x37A40000, 0x37A48000, 0x37A50000, 0x37A58000, 0x37A60000, 0x37A68000, 0x37A70000, 0x37A78000,
645 0x37A80000, 0x37A88000, 0x37A90000, 0x37A98000, 0x37AA0000, 0x37AA8000, 0x37AB0000, 0x37AB8000, 0x37AC0000, 0x37AC8000, 0x37AD0000, 0x37AD8000, 0x37AE0000, 0x37AE8000, 0x37AF0000, 0x37AF8000,
646 0x37B00000, 0x37B08000, 0x37B10000, 0x37B18000, 0x37B20000, 0x37B28000, 0x37B30000, 0x37B38000, 0x37B40000, 0x37B48000, 0x37B50000, 0x37B58000, 0x37B60000, 0x37B68000, 0x37B70000, 0x37B78000,
647 0x37B80000, 0x37B88000, 0x37B90000, 0x37B98000, 0x37BA0000, 0x37BA8000, 0x37BB0000, 0x37BB8000, 0x37BC0000, 0x37BC8000, 0x37BD0000, 0x37BD8000, 0x37BE0000, 0x37BE8000, 0x37BF0000, 0x37BF8000,
648 0x37C00000, 0x37C08000, 0x37C10000, 0x37C18000, 0x37C20000, 0x37C28000, 0x37C30000, 0x37C38000, 0x37C40000, 0x37C48000, 0x37C50000, 0x37C58000, 0x37C60000, 0x37C68000, 0x37C70000, 0x37C78000,
649 0x37C80000, 0x37C88000, 0x37C90000, 0x37C98000, 0x37CA0000, 0x37CA8000, 0x37CB0000, 0x37CB8000, 0x37CC0000, 0x37CC8000, 0x37CD0000, 0x37CD8000, 0x37CE0000, 0x37CE8000, 0x37CF0000, 0x37CF8000,
650 0x37D00000, 0x37D08000, 0x37D10000, 0x37D18000, 0x37D20000, 0x37D28000, 0x37D30000, 0x37D38000, 0x37D40000, 0x37D48000, 0x37D50000, 0x37D58000, 0x37D60000, 0x37D68000, 0x37D70000, 0x37D78000,
651 0x37D80000, 0x37D88000, 0x37D90000, 0x37D98000, 0x37DA0000, 0x37DA8000, 0x37DB0000, 0x37DB8000, 0x37DC0000, 0x37DC8000, 0x37DD0000, 0x37DD8000, 0x37DE0000, 0x37DE8000, 0x37DF0000, 0x37DF8000,
652 0x37E00000, 0x37E08000, 0x37E10000, 0x37E18000, 0x37E20000, 0x37E28000, 0x37E30000, 0x37E38000, 0x37E40000, 0x37E48000, 0x37E50000, 0x37E58000, 0x37E60000, 0x37E68000, 0x37E70000, 0x37E78000,
653 0x37E80000, 0x37E88000, 0x37E90000, 0x37E98000, 0x37EA0000, 0x37EA8000, 0x37EB0000, 0x37EB8000, 0x37EC0000, 0x37EC8000, 0x37ED0000, 0x37ED8000, 0x37EE0000, 0x37EE8000, 0x37EF0000, 0x37EF8000,
654 0x37F00000, 0x37F08000, 0x37F10000, 0x37F18000, 0x37F20000, 0x37F28000, 0x37F30000, 0x37F38000, 0x37F40000, 0x37F48000, 0x37F50000, 0x37F58000, 0x37F60000, 0x37F68000, 0x37F70000, 0x37F78000,
655 0x37F80000, 0x37F88000, 0x37F90000, 0x37F98000, 0x37FA0000, 0x37FA8000, 0x37FB0000, 0x37FB8000, 0x37FC0000, 0x37FC8000, 0x37FD0000, 0x37FD8000, 0x37FE0000, 0x37FE8000, 0x37FF0000, 0x37FF8000,
656 0x38000000, 0x38004000, 0x38008000, 0x3800C000, 0x38010000, 0x38014000, 0x38018000, 0x3801C000, 0x38020000, 0x38024000, 0x38028000, 0x3802C000, 0x38030000, 0x38034000, 0x38038000, 0x3803C000,
657 0x38040000, 0x38044000, 0x38048000, 0x3804C000, 0x38050000, 0x38054000, 0x38058000, 0x3805C000, 0x38060000, 0x38064000, 0x38068000, 0x3806C000, 0x38070000, 0x38074000, 0x38078000, 0x3807C000,
658 0x38080000, 0x38084000, 0x38088000, 0x3808C000, 0x38090000, 0x38094000, 0x38098000, 0x3809C000, 0x380A0000, 0x380A4000, 0x380A8000, 0x380AC000, 0x380B0000, 0x380B4000, 0x380B8000, 0x380BC000,
659 0x380C0000, 0x380C4000, 0x380C8000, 0x380CC000, 0x380D0000, 0x380D4000, 0x380D8000, 0x380DC000, 0x380E0000, 0x380E4000, 0x380E8000, 0x380EC000, 0x380F0000, 0x380F4000, 0x380F8000, 0x380FC000,
660 0x38100000, 0x38104000, 0x38108000, 0x3810C000, 0x38110000, 0x38114000, 0x38118000, 0x3811C000, 0x38120000, 0x38124000, 0x38128000, 0x3812C000, 0x38130000, 0x38134000, 0x38138000, 0x3813C000,
661 0x38140000, 0x38144000, 0x38148000, 0x3814C000, 0x38150000, 0x38154000, 0x38158000, 0x3815C000, 0x38160000, 0x38164000, 0x38168000, 0x3816C000, 0x38170000, 0x38174000, 0x38178000, 0x3817C000,
662 0x38180000, 0x38184000, 0x38188000, 0x3818C000, 0x38190000, 0x38194000, 0x38198000, 0x3819C000, 0x381A0000, 0x381A4000, 0x381A8000, 0x381AC000, 0x381B0000, 0x381B4000, 0x381B8000, 0x381BC000,
663 0x381C0000, 0x381C4000, 0x381C8000, 0x381CC000, 0x381D0000, 0x381D4000, 0x381D8000, 0x381DC000, 0x381E0000, 0x381E4000, 0x381E8000, 0x381EC000, 0x381F0000, 0x381F4000, 0x381F8000, 0x381FC000,
664 0x38200000, 0x38204000, 0x38208000, 0x3820C000, 0x38210000, 0x38214000, 0x38218000, 0x3821C000, 0x38220000, 0x38224000, 0x38228000, 0x3822C000, 0x38230000, 0x38234000, 0x38238000, 0x3823C000,
665 0x38240000, 0x38244000, 0x38248000, 0x3824C000, 0x38250000, 0x38254000, 0x38258000, 0x3825C000, 0x38260000, 0x38264000, 0x38268000, 0x3826C000, 0x38270000, 0x38274000, 0x38278000, 0x3827C000,
666 0x38280000, 0x38284000, 0x38288000, 0x3828C000, 0x38290000, 0x38294000, 0x38298000, 0x3829C000, 0x382A0000, 0x382A4000, 0x382A8000, 0x382AC000, 0x382B0000, 0x382B4000, 0x382B8000, 0x382BC000,
667 0x382C0000, 0x382C4000, 0x382C8000, 0x382CC000, 0x382D0000, 0x382D4000, 0x382D8000, 0x382DC000, 0x382E0000, 0x382E4000, 0x382E8000, 0x382EC000, 0x382F0000, 0x382F4000, 0x382F8000, 0x382FC000,
668 0x38300000, 0x38304000, 0x38308000, 0x3830C000, 0x38310000, 0x38314000, 0x38318000, 0x3831C000, 0x38320000, 0x38324000, 0x38328000, 0x3832C000, 0x38330000, 0x38334000, 0x38338000, 0x3833C000,
669 0x38340000, 0x38344000, 0x38348000, 0x3834C000, 0x38350000, 0x38354000, 0x38358000, 0x3835C000, 0x38360000, 0x38364000, 0x38368000, 0x3836C000, 0x38370000, 0x38374000, 0x38378000, 0x3837C000,
670 0x38380000, 0x38384000, 0x38388000, 0x3838C000, 0x38390000, 0x38394000, 0x38398000, 0x3839C000, 0x383A0000, 0x383A4000, 0x383A8000, 0x383AC000, 0x383B0000, 0x383B4000, 0x383B8000, 0x383BC000,
671 0x383C0000, 0x383C4000, 0x383C8000, 0x383CC000, 0x383D0000, 0x383D4000, 0x383D8000, 0x383DC000, 0x383E0000, 0x383E4000, 0x383E8000, 0x383EC000, 0x383F0000, 0x383F4000, 0x383F8000, 0x383FC000,
672 0x38400000, 0x38404000, 0x38408000, 0x3840C000, 0x38410000, 0x38414000, 0x38418000, 0x3841C000, 0x38420000, 0x38424000, 0x38428000, 0x3842C000, 0x38430000, 0x38434000, 0x38438000, 0x3843C000,
673 0x38440000, 0x38444000, 0x38448000, 0x3844C000, 0x38450000, 0x38454000, 0x38458000, 0x3845C000, 0x38460000, 0x38464000, 0x38468000, 0x3846C000, 0x38470000, 0x38474000, 0x38478000, 0x3847C000,
674 0x38480000, 0x38484000, 0x38488000, 0x3848C000, 0x38490000, 0x38494000, 0x38498000, 0x3849C000, 0x384A0000, 0x384A4000, 0x384A8000, 0x384AC000, 0x384B0000, 0x384B4000, 0x384B8000, 0x384BC000,
675 0x384C0000, 0x384C4000, 0x384C8000, 0x384CC000, 0x384D0000, 0x384D4000, 0x384D8000, 0x384DC000, 0x384E0000, 0x384E4000, 0x384E8000, 0x384EC000, 0x384F0000, 0x384F4000, 0x384F8000, 0x384FC000,
676 0x38500000, 0x38504000, 0x38508000, 0x3850C000, 0x38510000, 0x38514000, 0x38518000, 0x3851C000, 0x38520000, 0x38524000, 0x38528000, 0x3852C000, 0x38530000, 0x38534000, 0x38538000, 0x3853C000,
677 0x38540000, 0x38544000, 0x38548000, 0x3854C000, 0x38550000, 0x38554000, 0x38558000, 0x3855C000, 0x38560000, 0x38564000, 0x38568000, 0x3856C000, 0x38570000, 0x38574000, 0x38578000, 0x3857C000,
678 0x38580000, 0x38584000, 0x38588000, 0x3858C000, 0x38590000, 0x38594000, 0x38598000, 0x3859C000, 0x385A0000, 0x385A4000, 0x385A8000, 0x385AC000, 0x385B0000, 0x385B4000, 0x385B8000, 0x385BC000,
679 0x385C0000, 0x385C4000, 0x385C8000, 0x385CC000, 0x385D0000, 0x385D4000, 0x385D8000, 0x385DC000, 0x385E0000, 0x385E4000, 0x385E8000, 0x385EC000, 0x385F0000, 0x385F4000, 0x385F8000, 0x385FC000,
680 0x38600000, 0x38604000, 0x38608000, 0x3860C000, 0x38610000, 0x38614000, 0x38618000, 0x3861C000, 0x38620000, 0x38624000, 0x38628000, 0x3862C000, 0x38630000, 0x38634000, 0x38638000, 0x3863C000,
681 0x38640000, 0x38644000, 0x38648000, 0x3864C000, 0x38650000, 0x38654000, 0x38658000, 0x3865C000, 0x38660000, 0x38664000, 0x38668000, 0x3866C000, 0x38670000, 0x38674000, 0x38678000, 0x3867C000,
682 0x38680000, 0x38684000, 0x38688000, 0x3868C000, 0x38690000, 0x38694000, 0x38698000, 0x3869C000, 0x386A0000, 0x386A4000, 0x386A8000, 0x386AC000, 0x386B0000, 0x386B4000, 0x386B8000, 0x386BC000,
683 0x386C0000, 0x386C4000, 0x386C8000, 0x386CC000, 0x386D0000, 0x386D4000, 0x386D8000, 0x386DC000, 0x386E0000, 0x386E4000, 0x386E8000, 0x386EC000, 0x386F0000, 0x386F4000, 0x386F8000, 0x386FC000,
684 0x38700000, 0x38704000, 0x38708000, 0x3870C000, 0x38710000, 0x38714000, 0x38718000, 0x3871C000, 0x38720000, 0x38724000, 0x38728000, 0x3872C000, 0x38730000, 0x38734000, 0x38738000, 0x3873C000,
685 0x38740000, 0x38744000, 0x38748000, 0x3874C000, 0x38750000, 0x38754000, 0x38758000, 0x3875C000, 0x38760000, 0x38764000, 0x38768000, 0x3876C000, 0x38770000, 0x38774000, 0x38778000, 0x3877C000,
686 0x38780000, 0x38784000, 0x38788000, 0x3878C000, 0x38790000, 0x38794000, 0x38798000, 0x3879C000, 0x387A0000, 0x387A4000, 0x387A8000, 0x387AC000, 0x387B0000, 0x387B4000, 0x387B8000, 0x387BC000,
687 0x387C0000, 0x387C4000, 0x387C8000, 0x387CC000, 0x387D0000, 0x387D4000, 0x387D8000, 0x387DC000, 0x387E0000, 0x387E4000, 0x387E8000, 0x387EC000, 0x387F0000, 0x387F4000, 0x387F8000, 0x387FC000,
688 0x38000000, 0x38002000, 0x38004000, 0x38006000, 0x38008000, 0x3800A000, 0x3800C000, 0x3800E000, 0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801A000, 0x3801C000, 0x3801E000,
689 0x38020000, 0x38022000, 0x38024000, 0x38026000, 0x38028000, 0x3802A000, 0x3802C000, 0x3802E000, 0x38030000, 0x38032000, 0x38034000, 0x38036000, 0x38038000, 0x3803A000, 0x3803C000, 0x3803E000,
690 0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804A000, 0x3804C000, 0x3804E000, 0x38050000, 0x38052000, 0x38054000, 0x38056000, 0x38058000, 0x3805A000, 0x3805C000, 0x3805E000,
691 0x38060000, 0x38062000, 0x38064000, 0x38066000, 0x38068000, 0x3806A000, 0x3806C000, 0x3806E000, 0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807A000, 0x3807C000, 0x3807E000,
692 0x38080000, 0x38082000, 0x38084000, 0x38086000, 0x38088000, 0x3808A000, 0x3808C000, 0x3808E000, 0x38090000, 0x38092000, 0x38094000, 0x38096000, 0x38098000, 0x3809A000, 0x3809C000, 0x3809E000,
693 0x380A0000, 0x380A2000, 0x380A4000, 0x380A6000, 0x380A8000, 0x380AA000, 0x380AC000, 0x380AE000, 0x380B0000, 0x380B2000, 0x380B4000, 0x380B6000, 0x380B8000, 0x380BA000, 0x380BC000, 0x380BE000,
694 0x380C0000, 0x380C2000, 0x380C4000, 0x380C6000, 0x380C8000, 0x380CA000, 0x380CC000, 0x380CE000, 0x380D0000, 0x380D2000, 0x380D4000, 0x380D6000, 0x380D8000, 0x380DA000, 0x380DC000, 0x380DE000,
695 0x380E0000, 0x380E2000, 0x380E4000, 0x380E6000, 0x380E8000, 0x380EA000, 0x380EC000, 0x380EE000, 0x380F0000, 0x380F2000, 0x380F4000, 0x380F6000, 0x380F8000, 0x380FA000, 0x380FC000, 0x380FE000,
696 0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810A000, 0x3810C000, 0x3810E000, 0x38110000, 0x38112000, 0x38114000, 0x38116000, 0x38118000, 0x3811A000, 0x3811C000, 0x3811E000,
697 0x38120000, 0x38122000, 0x38124000, 0x38126000, 0x38128000, 0x3812A000, 0x3812C000, 0x3812E000, 0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813A000, 0x3813C000, 0x3813E000,
698 0x38140000, 0x38142000, 0x38144000, 0x38146000, 0x38148000, 0x3814A000, 0x3814C000, 0x3814E000, 0x38150000, 0x38152000, 0x38154000, 0x38156000, 0x38158000, 0x3815A000, 0x3815C000, 0x3815E000,
699 0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816A000, 0x3816C000, 0x3816E000, 0x38170000, 0x38172000, 0x38174000, 0x38176000, 0x38178000, 0x3817A000, 0x3817C000, 0x3817E000,
700 0x38180000, 0x38182000, 0x38184000, 0x38186000, 0x38188000, 0x3818A000, 0x3818C000, 0x3818E000, 0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819A000, 0x3819C000, 0x3819E000,
701 0x381A0000, 0x381A2000, 0x381A4000, 0x381A6000, 0x381A8000, 0x381AA000, 0x381AC000, 0x381AE000, 0x381B0000, 0x381B2000, 0x381B4000, 0x381B6000, 0x381B8000, 0x381BA000, 0x381BC000, 0x381BE000,
702 0x381C0000, 0x381C2000, 0x381C4000, 0x381C6000, 0x381C8000, 0x381CA000, 0x381CC000, 0x381CE000, 0x381D0000, 0x381D2000, 0x381D4000, 0x381D6000, 0x381D8000, 0x381DA000, 0x381DC000, 0x381DE000,
703 0x381E0000, 0x381E2000, 0x381E4000, 0x381E6000, 0x381E8000, 0x381EA000, 0x381EC000, 0x381EE000, 0x381F0000, 0x381F2000, 0x381F4000, 0x381F6000, 0x381F8000, 0x381FA000, 0x381FC000, 0x381FE000,
704 0x38200000, 0x38202000, 0x38204000, 0x38206000, 0x38208000, 0x3820A000, 0x3820C000, 0x3820E000, 0x38210000, 0x38212000, 0x38214000, 0x38216000, 0x38218000, 0x3821A000, 0x3821C000, 0x3821E000,
705 0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822A000, 0x3822C000, 0x3822E000, 0x38230000, 0x38232000, 0x38234000, 0x38236000, 0x38238000, 0x3823A000, 0x3823C000, 0x3823E000,
706 0x38240000, 0x38242000, 0x38244000, 0x38246000, 0x38248000, 0x3824A000, 0x3824C000, 0x3824E000, 0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825A000, 0x3825C000, 0x3825E000,
707 0x38260000, 0x38262000, 0x38264000, 0x38266000, 0x38268000, 0x3826A000, 0x3826C000, 0x3826E000, 0x38270000, 0x38272000, 0x38274000, 0x38276000, 0x38278000, 0x3827A000, 0x3827C000, 0x3827E000,
708 0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828A000, 0x3828C000, 0x3828E000, 0x38290000, 0x38292000, 0x38294000, 0x38296000, 0x38298000, 0x3829A000, 0x3829C000, 0x3829E000,
709 0x382A0000, 0x382A2000, 0x382A4000, 0x382A6000, 0x382A8000, 0x382AA000, 0x382AC000, 0x382AE000, 0x382B0000, 0x382B2000, 0x382B4000, 0x382B6000, 0x382B8000, 0x382BA000, 0x382BC000, 0x382BE000,
710 0x382C0000, 0x382C2000, 0x382C4000, 0x382C6000, 0x382C8000, 0x382CA000, 0x382CC000, 0x382CE000, 0x382D0000, 0x382D2000, 0x382D4000, 0x382D6000, 0x382D8000, 0x382DA000, 0x382DC000, 0x382DE000,
711 0x382E0000, 0x382E2000, 0x382E4000, 0x382E6000, 0x382E8000, 0x382EA000, 0x382EC000, 0x382EE000, 0x382F0000, 0x382F2000, 0x382F4000, 0x382F6000, 0x382F8000, 0x382FA000, 0x382FC000, 0x382FE000,
712 0x38300000, 0x38302000, 0x38304000, 0x38306000, 0x38308000, 0x3830A000, 0x3830C000, 0x3830E000, 0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831A000, 0x3831C000, 0x3831E000,
713 0x38320000, 0x38322000, 0x38324000, 0x38326000, 0x38328000, 0x3832A000, 0x3832C000, 0x3832E000, 0x38330000, 0x38332000, 0x38334000, 0x38336000, 0x38338000, 0x3833A000, 0x3833C000, 0x3833E000,
714 0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834A000, 0x3834C000, 0x3834E000, 0x38350000, 0x38352000, 0x38354000, 0x38356000, 0x38358000, 0x3835A000, 0x3835C000, 0x3835E000,
715 0x38360000, 0x38362000, 0x38364000, 0x38366000, 0x38368000, 0x3836A000, 0x3836C000, 0x3836E000, 0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837A000, 0x3837C000, 0x3837E000,
716 0x38380000, 0x38382000, 0x38384000, 0x38386000, 0x38388000, 0x3838A000, 0x3838C000, 0x3838E000, 0x38390000, 0x38392000, 0x38394000, 0x38396000, 0x38398000, 0x3839A000, 0x3839C000, 0x3839E000,
717 0x383A0000, 0x383A2000, 0x383A4000, 0x383A6000, 0x383A8000, 0x383AA000, 0x383AC000, 0x383AE000, 0x383B0000, 0x383B2000, 0x383B4000, 0x383B6000, 0x383B8000, 0x383BA000, 0x383BC000, 0x383BE000,
718 0x383C0000, 0x383C2000, 0x383C4000, 0x383C6000, 0x383C8000, 0x383CA000, 0x383CC000, 0x383CE000, 0x383D0000, 0x383D2000, 0x383D4000, 0x383D6000, 0x383D8000, 0x383DA000, 0x383DC000, 0x383DE000,
719 0x383E0000, 0x383E2000, 0x383E4000, 0x383E6000, 0x383E8000, 0x383EA000, 0x383EC000, 0x383EE000, 0x383F0000, 0x383F2000, 0x383F4000, 0x383F6000, 0x383F8000, 0x383FA000, 0x383FC000, 0x383FE000,
720 0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840A000, 0x3840C000, 0x3840E000, 0x38410000, 0x38412000, 0x38414000, 0x38416000, 0x38418000, 0x3841A000, 0x3841C000, 0x3841E000,
721 0x38420000, 0x38422000, 0x38424000, 0x38426000, 0x38428000, 0x3842A000, 0x3842C000, 0x3842E000, 0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843A000, 0x3843C000, 0x3843E000,
722 0x38440000, 0x38442000, 0x38444000, 0x38446000, 0x38448000, 0x3844A000, 0x3844C000, 0x3844E000, 0x38450000, 0x38452000, 0x38454000, 0x38456000, 0x38458000, 0x3845A000, 0x3845C000, 0x3845E000,
723 0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846A000, 0x3846C000, 0x3846E000, 0x38470000, 0x38472000, 0x38474000, 0x38476000, 0x38478000, 0x3847A000, 0x3847C000, 0x3847E000,
724 0x38480000, 0x38482000, 0x38484000, 0x38486000, 0x38488000, 0x3848A000, 0x3848C000, 0x3848E000, 0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849A000, 0x3849C000, 0x3849E000,
725 0x384A0000, 0x384A2000, 0x384A4000, 0x384A6000, 0x384A8000, 0x384AA000, 0x384AC000, 0x384AE000, 0x384B0000, 0x384B2000, 0x384B4000, 0x384B6000, 0x384B8000, 0x384BA000, 0x384BC000, 0x384BE000,
726 0x384C0000, 0x384C2000, 0x384C4000, 0x384C6000, 0x384C8000, 0x384CA000, 0x384CC000, 0x384CE000, 0x384D0000, 0x384D2000, 0x384D4000, 0x384D6000, 0x384D8000, 0x384DA000, 0x384DC000, 0x384DE000,
727 0x384E0000, 0x384E2000, 0x384E4000, 0x384E6000, 0x384E8000, 0x384EA000, 0x384EC000, 0x384EE000, 0x384F0000, 0x384F2000, 0x384F4000, 0x384F6000, 0x384F8000, 0x384FA000, 0x384FC000, 0x384FE000,
728 0x38500000, 0x38502000, 0x38504000, 0x38506000, 0x38508000, 0x3850A000, 0x3850C000, 0x3850E000, 0x38510000, 0x38512000, 0x38514000, 0x38516000, 0x38518000, 0x3851A000, 0x3851C000, 0x3851E000,
729 0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852A000, 0x3852C000, 0x3852E000, 0x38530000, 0x38532000, 0x38534000, 0x38536000, 0x38538000, 0x3853A000, 0x3853C000, 0x3853E000,
730 0x38540000, 0x38542000, 0x38544000, 0x38546000, 0x38548000, 0x3854A000, 0x3854C000, 0x3854E000, 0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855A000, 0x3855C000, 0x3855E000,
731 0x38560000, 0x38562000, 0x38564000, 0x38566000, 0x38568000, 0x3856A000, 0x3856C000, 0x3856E000, 0x38570000, 0x38572000, 0x38574000, 0x38576000, 0x38578000, 0x3857A000, 0x3857C000, 0x3857E000,
732 0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858A000, 0x3858C000, 0x3858E000, 0x38590000, 0x38592000, 0x38594000, 0x38596000, 0x38598000, 0x3859A000, 0x3859C000, 0x3859E000,
733 0x385A0000, 0x385A2000, 0x385A4000, 0x385A6000, 0x385A8000, 0x385AA000, 0x385AC000, 0x385AE000, 0x385B0000, 0x385B2000, 0x385B4000, 0x385B6000, 0x385B8000, 0x385BA000, 0x385BC000, 0x385BE000,
734 0x385C0000, 0x385C2000, 0x385C4000, 0x385C6000, 0x385C8000, 0x385CA000, 0x385CC000, 0x385CE000, 0x385D0000, 0x385D2000, 0x385D4000, 0x385D6000, 0x385D8000, 0x385DA000, 0x385DC000, 0x385DE000,
735 0x385E0000, 0x385E2000, 0x385E4000, 0x385E6000, 0x385E8000, 0x385EA000, 0x385EC000, 0x385EE000, 0x385F0000, 0x385F2000, 0x385F4000, 0x385F6000, 0x385F8000, 0x385FA000, 0x385FC000, 0x385FE000,
736 0x38600000, 0x38602000, 0x38604000, 0x38606000, 0x38608000, 0x3860A000, 0x3860C000, 0x3860E000, 0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861A000, 0x3861C000, 0x3861E000,
737 0x38620000, 0x38622000, 0x38624000, 0x38626000, 0x38628000, 0x3862A000, 0x3862C000, 0x3862E000, 0x38630000, 0x38632000, 0x38634000, 0x38636000, 0x38638000, 0x3863A000, 0x3863C000, 0x3863E000,
738 0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864A000, 0x3864C000, 0x3864E000, 0x38650000, 0x38652000, 0x38654000, 0x38656000, 0x38658000, 0x3865A000, 0x3865C000, 0x3865E000,
739 0x38660000, 0x38662000, 0x38664000, 0x38666000, 0x38668000, 0x3866A000, 0x3866C000, 0x3866E000, 0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867A000, 0x3867C000, 0x3867E000,
740 0x38680000, 0x38682000, 0x38684000, 0x38686000, 0x38688000, 0x3868A000, 0x3868C000, 0x3868E000, 0x38690000, 0x38692000, 0x38694000, 0x38696000, 0x38698000, 0x3869A000, 0x3869C000, 0x3869E000,
741 0x386A0000, 0x386A2000, 0x386A4000, 0x386A6000, 0x386A8000, 0x386AA000, 0x386AC000, 0x386AE000, 0x386B0000, 0x386B2000, 0x386B4000, 0x386B6000, 0x386B8000, 0x386BA000, 0x386BC000, 0x386BE000,
742 0x386C0000, 0x386C2000, 0x386C4000, 0x386C6000, 0x386C8000, 0x386CA000, 0x386CC000, 0x386CE000, 0x386D0000, 0x386D2000, 0x386D4000, 0x386D6000, 0x386D8000, 0x386DA000, 0x386DC000, 0x386DE000,
743 0x386E0000, 0x386E2000, 0x386E4000, 0x386E6000, 0x386E8000, 0x386EA000, 0x386EC000, 0x386EE000, 0x386F0000, 0x386F2000, 0x386F4000, 0x386F6000, 0x386F8000, 0x386FA000, 0x386FC000, 0x386FE000,
744 0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870A000, 0x3870C000, 0x3870E000, 0x38710000, 0x38712000, 0x38714000, 0x38716000, 0x38718000, 0x3871A000, 0x3871C000, 0x3871E000,
745 0x38720000, 0x38722000, 0x38724000, 0x38726000, 0x38728000, 0x3872A000, 0x3872C000, 0x3872E000, 0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873A000, 0x3873C000, 0x3873E000,
746 0x38740000, 0x38742000, 0x38744000, 0x38746000, 0x38748000, 0x3874A000, 0x3874C000, 0x3874E000, 0x38750000, 0x38752000, 0x38754000, 0x38756000, 0x38758000, 0x3875A000, 0x3875C000, 0x3875E000,
747 0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876A000, 0x3876C000, 0x3876E000, 0x38770000, 0x38772000, 0x38774000, 0x38776000, 0x38778000, 0x3877A000, 0x3877C000, 0x3877E000,
748 0x38780000, 0x38782000, 0x38784000, 0x38786000, 0x38788000, 0x3878A000, 0x3878C000, 0x3878E000, 0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879A000, 0x3879C000, 0x3879E000,
749 0x387A0000, 0x387A2000, 0x387A4000, 0x387A6000, 0x387A8000, 0x387AA000, 0x387AC000, 0x387AE000, 0x387B0000, 0x387B2000, 0x387B4000, 0x387B6000, 0x387B8000, 0x387BA000, 0x387BC000, 0x387BE000,
750 0x387C0000, 0x387C2000, 0x387C4000, 0x387C6000, 0x387C8000, 0x387CA000, 0x387CC000, 0x387CE000, 0x387D0000, 0x387D2000, 0x387D4000, 0x387D6000, 0x387D8000, 0x387DA000, 0x387DC000, 0x387DE000,
751 0x387E0000, 0x387E2000, 0x387E4000, 0x387E6000, 0x387E8000, 0x387EA000, 0x387EC000, 0x387EE000, 0x387F0000, 0x387F2000, 0x387F4000, 0x387F6000, 0x387F8000, 0x387FA000, 0x387FC000, 0x387FE000 };
752 static const uint32 exponent_table[64] = {
753 0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000, 0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000, 0x06000000, 0x06800000, 0x07000000, 0x07800000,
754 0x08000000, 0x08800000, 0x09000000, 0x09800000, 0x0A000000, 0x0A800000, 0x0B000000, 0x0B800000, 0x0C000000, 0x0C800000, 0x0D000000, 0x0D800000, 0x0E000000, 0x0E800000, 0x0F000000, 0x47800000,
755 0x80000000, 0x80800000, 0x81000000, 0x81800000, 0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000, 0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000,
756 0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8A000000, 0x8A800000, 0x8B000000, 0x8B800000, 0x8C000000, 0x8C800000, 0x8D000000, 0x8D800000, 0x8E000000, 0x8E800000, 0x8F000000, 0xC7800000 };
757 static const unsigned short offset_table[64] = {
758 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,
759 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 };
760 uint32 bits = mantissa_table[offset_table[value>>10]+(value&0x3FF)] + exponent_table[value>>10];
764 std::memcpy(&out, &bits,
sizeof(
float));
774 int abs = value & 0x7FFF;
776 out = std::numeric_limits<float>::has_quiet_NaN ? std::numeric_limits<float>::quiet_NaN() : 0.0f;
777 else if(
abs == 0x7C00)
778 out = std::numeric_limits<float>::has_infinity ? std::numeric_limits<float>::infinity() : std::numeric_limits<float>::max();
780 out = std::ldexp(
static_cast<float>((value&0x3FF)|0x400), (
abs>>10)-25);
782 out = std::ldexp(
static_cast<float>(
abs), -24);
783 return (value&0x8000) ? -out : out;
802 unsigned int e = value & 0x7FFF;
804 return (value&0x8000) ? std::numeric_limits<T>::min() : std::numeric_limits<T>::max();
807 if(R == std::round_toward_infinity)
808 return T(~(value>>15)&(e!=0));
809 else if(R == std::round_toward_neg_infinity)
810 return -T(value>0x8000);
813 int17 m = (value&0x3FF) | 0x400;
817 if(R == std::round_indeterminate || R == std::round_toward_zero)
821 if(R == std::round_to_nearest)
822 m += (1<<(24-e)) - (~(m>>(25-e))&E);
823 else if(R == std::round_toward_infinity)
824 m += ((value>>15)-1) & ((1<<(25-e))-1U);
825 else if(R == std::round_toward_neg_infinity)
826 m += -(value>>15) & ((1<<(25-e))-1U);
834 return static_cast<T
>((value&0x8000) ? -m : m);
842 template<std::
float_round_style R,
typename T> T
half2int(
uint16 value) {
return half2int_impl<R,HALF_ROUND_TIES_TO_EVEN,T>(value); }
848 template<
typename T> T
half2int_up(
uint16 value) {
return half2int_impl<std::round_to_nearest,0,T>(value); }
857 unsigned int e = value & 0x7FFF;
862 if(R == std::round_to_nearest)
863 result |= 0x3C00U & -(e>=(0x3800+E));
864 else if(R == std::round_toward_infinity)
865 result |= 0x3C00U & -(~(value>>15)&(e!=0));
866 else if(R == std::round_toward_neg_infinity)
867 result |= 0x3C00U & -(value>0x8000);
872 unsigned int mask = (1<<e) - 1;
873 if(R == std::round_to_nearest)
875 else if(R == std::round_toward_infinity)
876 result += mask & ((value>>15)-1);
877 else if(R == std::round_toward_neg_infinity)
878 result += mask & -(value>>15);
888 template<std::
float_round_style R>
uint16 round_half(
uint16 value) {
return round_half_impl<R,HALF_ROUND_TIES_TO_EVEN>(value); }
897 template<
typename>
struct unary_specialized;
898 template<
typename,
typename>
struct binary_specialized;
899 template<
typename,
typename,std::
float_round_style>
struct half_caster;
928 friend class std::numeric_limits<
half>;
929 #if HALF_ENABLE_CPP11_HASH
930 friend struct std::hash<
half>;
937 HALF_CONSTEXPR
half() : data_() {}
946 explicit half(
float rhs) : data_(detail::float2half<round_style>(rhs)) {}
950 operator float()
const {
return detail::half2float(data_); }
985 half&
operator=(
float rhs) { data_ = detail::float2half<round_style>(rhs);
return *
this; }
990 half&
operator+=(
float rhs) { data_ = detail::float2half<round_style>(detail::half2float(data_)+rhs);
return *
this; }
995 half&
operator-=(
float rhs) { data_ = detail::float2half<round_style>(detail::half2float(data_)-rhs);
return *
this; }
1000 half&
operator*=(
float rhs) { data_ = detail::float2half<round_style>(detail::half2float(data_)*rhs);
return *
this; }
1005 half&
operator/=(
float rhs) { data_ = detail::float2half<round_style>(detail::half2float(data_)/rhs);
return *
this; }
1025 static const std::float_round_style round_style = (std::float_round_style)(
HALF_ROUND_STYLE);
1032 detail::uint16 data_;
1035 #if HALF_ENABLE_CPP11_USER_LITERALS
1049 inline half
operator "" _h(
long double value) {
return half(
static_cast<float>(value)); }
1086 template<
typename charT,
typename traits>
static std::basic_ostream<charT,traits>&
write(std::basic_ostream<charT,traits> &out,
float arg) {
return out << arg; }
1092 template<
typename charT,
typename traits>
static std::basic_istream<charT,traits>&
read(std::basic_istream<charT,traits> &in,
half &arg)
1112 #if HALF_ENABLE_CPP11_CMATH
1113 return expr(std::remainder(x, y));
1116 return expr(std::numeric_limits<float>::quiet_NaN());
1117 float ax = std::fabs(x), ay = std::fabs(y);
1118 if(ax >= 65536.0f || ay < std::ldexp(1.0f, -24))
1119 return expr(std::numeric_limits<float>::quiet_NaN());
1124 ax = std::fmod(ax, ay+ay);
1125 float y2 = 0.5f * ay;
1143 #if HALF_ENABLE_CPP11_CMATH
1144 return expr(std::remquo(x, y, quo));
1147 return expr(std::numeric_limits<float>::quiet_NaN());
1149 float ax = std::fabs(x), ay = std::fabs(y);
1150 if(ax >= 65536.0f || ay < std::ldexp(1.0f, -24))
1151 return expr(std::numeric_limits<float>::quiet_NaN());
1155 return *quo = qsign ? -1 : 1,
expr(sign ? -0.0f : 0.0f);
1156 ax = std::fmod(ax, 8.0f*ay);
1168 float y2 = 0.5f * ay;
1179 return *quo = qsign ? -cquo : cquo,
expr(sign ? -ax : ax);
1189 #if HALF_ENABLE_CPP11_CMATH
1190 return expr(std::fdim(x, y));
1192 return expr((x<=y) ? 0.0f : (x-y));
1203 #if HALF_ENABLE_CPP11_CMATH && defined(FP_FAST_FMAF)
1204 return expr(std::fma(x, y, z));
1224 #if HALF_ENABLE_CPP11_CMATH
1225 return expr(std::expm1(arg));
1227 return expr(
static_cast<float>(std::exp(
static_cast<double>(arg))-1.0));
1236 #if HALF_ENABLE_CPP11_CMATH
1237 return expr(std::exp2(arg));
1239 return expr(
static_cast<float>(std::exp(arg*0.69314718055994530941723212145818)));
1258 #if HALF_ENABLE_CPP11_CMATH
1259 return expr(std::log1p(arg));
1261 return expr(
static_cast<float>(std::log(1.0+arg)));
1270 #if HALF_ENABLE_CPP11_CMATH
1271 return expr(std::log2(arg));
1273 return expr(
static_cast<float>(std::log(
static_cast<double>(arg))*1.4426950408889634073599246810019));
1287 #if HALF_ENABLE_CPP11_CMATH
1288 return expr(std::cbrt(arg));
1292 return expr(
builtin_signbit(arg) ? -
static_cast<float>(std::pow(std::fabs(
static_cast<double>(arg)), 1.0/3.0)) :
1293 static_cast<float>(std::pow(
static_cast<double>(arg), 1.0/3.0)));
1303 #if HALF_ENABLE_CPP11_CMATH
1304 return expr(std::hypot(x, y));
1307 static_cast<float>(std::sqrt(
static_cast<double>(x)*x+
static_cast<double>(y)*y)));
1373 #if HALF_ENABLE_CPP11_CMATH
1374 return expr(std::asinh(arg));
1376 return expr((arg==-std::numeric_limits<float>::infinity()) ? arg :
static_cast<float>(std::log(arg+std::sqrt(arg*arg+1.0))));
1385 #if HALF_ENABLE_CPP11_CMATH
1386 return expr(std::acosh(arg));
1388 return expr((arg<-1.0f) ? std::numeric_limits<float>::quiet_NaN() :
static_cast<float>(std::log(arg+std::sqrt(arg*arg-1.0))));
1397 #if HALF_ENABLE_CPP11_CMATH
1398 return expr(std::atanh(arg));
1400 return expr(
static_cast<float>(0.5*std::log((1.0+arg)/(1.0-arg))));
1409 #if HALF_ENABLE_CPP11_CMATH
1410 return expr(std::erf(arg));
1412 return expr(
static_cast<float>(
erf(
static_cast<double>(arg))));
1421 #if HALF_ENABLE_CPP11_CMATH
1422 return expr(std::erfc(arg));
1424 return expr(
static_cast<float>(1.0-
erf(
static_cast<double>(arg))));
1433 #if HALF_ENABLE_CPP11_CMATH
1434 return expr(std::lgamma(arg));
1437 return expr(std::numeric_limits<float>::infinity());
1438 double z =
static_cast<double>(arg);
1441 double i, f = std::modf(-z, &i);
1443 return expr(std::numeric_limits<float>::infinity());
1444 return expr(
static_cast<float>(1.1447298858494001741434273513531-std::log(std::abs(std::sin(3.1415926535897932384626433832795*f)))-
lgamma(1.0-z)));
1447 return expr(
static_cast<float>(
lgamma(
static_cast<double>(arg))));
1448 return expr(
static_cast<float>(0.5*(1.8378770664093454835606594728112-std::log(z))+z*(std::log(z+1.0/(12.0*z-1.0/(10.0*z)-1.0))-1.0)));
1457 #if HALF_ENABLE_CPP11_CMATH
1458 return expr(std::tgamma(arg));
1460 double z =
static_cast<double>(arg);
1462 return builtin_signbit(z) ?
expr(-std::numeric_limits<float>::infinity()) :
expr(std::numeric_limits<float>::infinity());
1465 double i, f = std::modf(-z, &i);
1467 return expr(std::numeric_limits<float>::quiet_NaN());
1468 double sign = (std::fmod(i, 2.0)==0.0) ? -1.0 : 1.0;
1469 return expr(
static_cast<float>(sign*3.1415926535897932384626433832795/(std::sin(3.1415926535897932384626433832795*f)*std::exp(
lgamma(1.0-z)))));
1474 return expr(
static_cast<float>(std::exp(
lgamma(z))));
1475 return expr(
static_cast<float>(std::sqrt(6.283185307179586476925286766559/z)*std::pow(0.36787944117144232159552377016146*(z+1.0/(12.0*z-1.0/(10.0*z))), z)));
1482 static half floor(
half arg) {
return half(binary, round_half<std::round_toward_neg_infinity>(arg.data_)); }
1487 static half ceil(
half arg) {
return half(binary, round_half<std::round_toward_infinity>(arg.data_)); }
1502 static long lround(
half arg) {
return detail::half2int_up<long>(arg.data_); }
1512 static long lrint(
half arg) {
return detail::half2int<half::round_style,long>(arg.data_); }
1514 #if HALF_ENABLE_CPP11_LONG_LONG
1515 static long long llround(
half arg) {
return detail::half2int_up<long long>(arg.data_); }
1523 static long long llrint(
half arg) {
return detail::half2int<half::round_style,long long>(arg.data_); }
1532 unsigned int m = arg.data_ & 0x7FFF;
1533 if(m >= 0x7C00 || !m)
1534 return *
exp = 0, arg;
1537 for(m<<=1; m<0x400; m<<=1,--e) ;
1538 return *
exp = e-14,
half(binary,
static_cast<uint16>((arg.data_&0x8000)|0x3800|(m&0x3FF)));
1547 unsigned int e = arg.data_ & 0x7C00;
1549 return *iptr = arg, (e==0x7C00&&(arg.data_&0x3FF)) ? arg :
half(binary, arg.data_&0x8000);
1551 return iptr->data_ = arg.data_ & 0x8000, arg;
1553 unsigned int mask = (1<<(25-e)) - 1, m = arg.data_ & mask;
1554 iptr->data_ = arg.data_ & ~mask;
1556 return half(binary, arg.data_&0x8000);
1557 for(; m<0x400; m<<=1,--e) ;
1558 return half(binary,
static_cast<uint16>((arg.data_&0x8000)|(e<<10)|(m&0x3FF)));
1567 long e = arg.data_ & 0x7C00;
1570 unsigned int m = arg.data_ & 0x3FF;
1577 for(m<<=1; m<0x400; m<<=1,--e) ;
1580 uint16 value = arg.data_ & 0x8000;
1583 if(half::round_style == std::round_toward_zero)
1585 else if(half::round_style == std::round_toward_infinity)
1586 value |= 0x7C00 - (value>>15);
1587 else if(half::round_style == std::round_toward_neg_infinity)
1588 value |= 0x7BFF + (value>>15);
1593 value |= (e<<10) | (m&0x3FF);
1596 if(half::round_style == std::round_to_nearest)
1599 #if HALF_ROUND_TIES_TO_EVEN
1600 m -= (m>>(1-e)) & 1;
1603 else if(half::round_style == std::round_toward_infinity)
1604 m += ((value>>15)-1) & ((1<<(1-e))-1U);
1605 else if(half::round_style == std::round_toward_neg_infinity)
1606 m += -(value>>15) & ((1<<(1-e))-1U);
1607 value |= m >> (1-e);
1609 else if(half::round_style == std::round_toward_infinity)
1610 value |= ((value>>15)-1) & 1;
1611 else if(half::round_style == std::round_toward_neg_infinity)
1612 value |= value >> 15;
1613 return half(binary, value);
1621 int exp = arg.data_ & 0x7FFF;
1627 for(
unsigned int m=(arg.data_&0x3FF); m<0x200; m<<=1,--
exp) ;
1640 int exp = arg.data_ & 0x7FFF;
1642 return half(binary, 0xFC00);
1646 for(
unsigned int m=(arg.data_&0x3FF); m<0x200; m<<=1,--
exp) ;
1647 return half(
static_cast<float>(
exp-15));
1651 return half(binary, 0x7C00);
1660 uint16 fabs = from.data_ & 0x7FFF, tabs = to.data_ & 0x7FFF;
1663 if(tabs > 0x7C00 || from.data_ == to.data_ || !(
fabs|tabs))
1666 return half(binary, (to.data_&0x8000)+1);
1667 bool lt = (
signbit(from) ? (
static_cast<int17
>(0x8000)-from.data_) :
static_cast<int17
>(from.data_)) <
1668 (
signbit(to) ? (
static_cast<int17
>(0x8000)-to.data_) :
static_cast<int17
>(to.data_));
1669 return half(binary, from.data_+(((from.data_>>15)^
static_cast<uint16>(lt))<<1)-1);
1680 long double lfrom =
static_cast<long double>(from);
1682 return half(
static_cast<float>(to));
1683 if(!(from.data_&0x7FFF))
1685 return half(binary, from.data_+(((from.data_>>15)^
static_cast<uint16>(lfrom<to))<<1)-1);
1700 unsigned int abs = arg.data_ & 0x7FFF;
1707 return abs ? FP_SUBNORMAL : FP_ZERO;
1720 static bool isinf(
half arg) {
return (arg.data_&0x7FFF) == 0x7C00; }
1726 static bool isnan(
half arg) {
return (arg.data_&0x7FFF) > 0x7C00; }
1732 static bool isnormal(
half arg) {
return ((arg.data_&0x7C00)!=0) & ((arg.data_&0x7C00)!=0x7C00); }
1760 static_cast<int17
>(x.data_)) > (
signbit(y) ? (
static_cast<int17
>(0x8000)-y.data_) :
static_cast<int17
>(y.data_))); }
1768 static_cast<int17
>(x.data_)) >= (
signbit(y) ? (
static_cast<int17
>(0x8000)-y.data_) :
static_cast<int17
>(y.data_))); }
1776 static_cast<int17
>(x.data_)) < (
signbit(y) ? (
static_cast<int17
>(0x8000)-y.data_) :
static_cast<int17
>(y.data_))); }
1784 static_cast<int17
>(x.data_)) <= (
signbit(y) ? (
static_cast<int17
>(0x8000)-y.data_) :
static_cast<int17
>(y.data_))); }
1795 int17 a =
signbit(x) ? (
static_cast<int17
>(0x8000)-x.data_) :
static_cast<int17
>(x.data_);
1796 int17 b =
signbit(y) ? (
static_cast<int17
>(0x8000)-y.data_) :
static_cast<int17
>(y.data_);
1797 return a < b || a > b;
1808 static double erf(
double arg)
1811 return (arg<0.0) ? -1.0 : 1.0;
1812 double x2 =
static_cast<double>(arg) *
static_cast<double>(arg), ax2 = 0.147 * x2;
1813 double value = std::sqrt(1.0-std::exp(-x2*(1.2732395447351626861510701069801+ax2)/(1.0+ax2)));
1817 static double lgamma(
double arg)
1820 for(; arg<8.0; ++arg) v *= arg;
1821 double w = 1.0 / (arg * arg);
1822 return (((((((-0.02955065359477124183006535947712*w+0.00641025641025641025641025641026)*w+
1823 -0.00191752691752691752691752691753)*w+8.4175084175084175084175084175084e-4)*w+
1824 -5.952380952380952380952380952381e-4)*w+7.9365079365079365079365079365079e-4)*w+
1825 -0.00277777777777777777777777777778)*w+0.08333333333333333333333333333333)/arg +
1826 0.91893853320467274178032973640562 - std::log(v) - arg + (arg-0.5) * std::log(arg);
1846 static HALF_CONSTEXPR
expr negate(
float arg) {
return expr(-arg); }
1847 static expr fabs(
float arg) {
return expr(std::fabs(arg)); }
1861 #if HALF_ENABLE_CPP11_CMATH
1862 return expr(std::fmin(x, y));
1868 return expr(std::min(x, y));
1878 #if HALF_ENABLE_CPP11_CMATH
1879 return expr(std::fmax(x, y));
1885 return expr(std::max(x, y));
1897 return ((
functions::signbit(x) ? (
static_cast<int17
>(0x8000)-x.data_) :
static_cast<int17
>(x.data_)) >
1898 (
functions::signbit(y) ? (
static_cast<int17
>(0x8000)-y.data_) :
static_cast<int17
>(y.data_))) ? y : x;
1906 return ((
functions::signbit(x) ? (
static_cast<int17
>(0x8000)-x.data_) :
static_cast<int17
>(x.data_)) <
1907 (
functions::signbit(y) ? (
static_cast<int17
>(0x8000)-y.data_) :
static_cast<int17
>(y.data_))) ? y : x;
1917 template<
typename T,
typename U,std::
float_round_style R=(std::
float_round_style)(HALF_ROUND_STYLE)>
struct half_caster {};
1920 #if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
1921 static_assert(std::is_arithmetic<U>::value,
"half_cast from non-arithmetic type unsupported");
1928 static half cast_impl(U arg,
true_type) {
return half(binary, float2half<R>(
static_cast<float>(arg))); }
1933 #if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
1934 static_assert(std::is_arithmetic<T>::value,
"half_cast to non-arithmetic type unsupported");
1938 template<
typename U>
static T cast(U arg) {
return cast_impl(arg,
is_float<T>()); }
1941 static T cast_impl(
float arg,
true_type) {
return static_cast<T
>(arg); }
1942 static T cast_impl(
half arg,
false_type) {
return half2int<R,T>(arg.data_); }
1948 static half cast(
half arg) {
return arg; }
2044 operator<<(std::basic_ostream<charT,traits> &out, T arg) {
return functions::write(out, arg); }
2050 template<
typename charT,
typename traits> std::basic_istream<charT,traits>&
2099 inline expr remquo(expr x, half y,
int *quo) {
return functions::remquo(x, y, quo); }
2110 inline expr fma(half x, expr y, half z) {
return functions::fma(x, y, z); }
2240 inline expr pow(expr base, half exp) {
return functions::pow(base, exp); }
2436 #if HALF_ENABLE_CPP11_LONG_LONG
2441 inline long long llround(half arg) {
return functions::llround(arg); }
2442 inline long long llround(expr arg) {
return functions::llround(arg); }
2448 inline long long llrint(half arg) {
return functions::llrint(arg); }
2449 inline long long llrint(expr arg) {
return functions::llrint(arg); }
2706 using detail::operator==;
2707 using detail::operator!=;
2708 using detail::operator<;
2709 using detail::operator>;
2710 using detail::operator<=;
2711 using detail::operator>=;
2712 using detail::operator+;
2713 using detail::operator-;
2714 using detail::operator*;
2715 using detail::operator/;
2716 using detail::operator<<;
2717 using detail::operator>>;
2722 using detail::remainder;
2723 using detail::remquo;
2730 using detail::expm1;
2733 using detail::log10;
2734 using detail::log1p;
2738 using detail::hypot;
2746 using detail::atan2;
2750 using detail::asinh;
2751 using detail::acosh;
2752 using detail::atanh;
2755 using detail::lgamma;
2756 using detail::tgamma;
2758 using detail::floor;
2759 using detail::trunc;
2760 using detail::round;
2761 using detail::lround;
2762 using detail::nearbyint;
2764 using detail::lrint;
2765 #if HALF_ENABLE_CPP11_LONG_LONG
2766 using detail::llround;
2767 using detail::llrint;
2769 using detail::frexp;
2770 using detail::ldexp;
2772 using detail::scalbn;
2773 using detail::scalbln;
2774 using detail::ilogb;
2776 using detail::nextafter;
2777 using detail::nexttoward;
2778 using detail::copysign;
2779 using detail::fpclassify;
2780 using detail::isfinite;
2781 using detail::isinf;
2782 using detail::isnan;
2783 using detail::isnormal;
2784 using detail::signbit;
2785 using detail::isgreater;
2786 using detail::isgreaterequal;
2787 using detail::isless;
2788 using detail::islessequal;
2789 using detail::islessgreater;
2790 using detail::isunordered;
2792 using detail::half_cast;
2802 template<>
class numeric_limits<
half_float::half> :
public numeric_limits<float>
2806 static HALF_CONSTEXPR_CONST
bool is_signed =
true;
2809 static HALF_CONSTEXPR_CONST
bool is_exact =
false;
2812 static HALF_CONSTEXPR_CONST
bool is_modulo =
false;
2815 static HALF_CONSTEXPR_CONST
bool is_iec559 =
true;
2818 static HALF_CONSTEXPR_CONST
bool has_infinity =
true;
2821 static HALF_CONSTEXPR_CONST
bool has_quiet_NaN =
true;
2824 static HALF_CONSTEXPR_CONST float_denorm_style has_denorm = denorm_present;
2830 static HALF_CONSTEXPR_CONST float_round_style round_style = (std::numeric_limits<float>::round_style==
2831 half_float::half::round_style) ? half_float::half::round_style : round_indeterminate;
2834 static HALF_CONSTEXPR_CONST
int digits = 11;
2837 static HALF_CONSTEXPR_CONST
int digits10 = 3;
2840 static HALF_CONSTEXPR_CONST
int max_digits10 = 5;
2843 static HALF_CONSTEXPR_CONST
int radix = 2;
2846 static HALF_CONSTEXPR_CONST
int min_exponent = -13;
2849 static HALF_CONSTEXPR_CONST
int min_exponent10 = -4;
2852 static HALF_CONSTEXPR_CONST
int max_exponent = 16;
2855 static HALF_CONSTEXPR_CONST
int max_exponent10 = 4;
2871 {
return half_float::half(half_float::detail::binary, (round_style==std::round_to_nearest) ? 0x3800 : 0x3C00); }
2886 #if HALF_ENABLE_CPP11_HASH
2895 typedef size_t result_type;
2900 result_type operator()(argument_type arg)
const
2901 {
return hash<half_float::detail::uint16>()(
static_cast<unsigned int>(arg.data_)&-(arg.data_!=0x8000)); }
2907 #undef HALF_CONSTEXPR
2908 #undef HALF_CONSTEXPR_CONST
2909 #undef HALF_NOEXCEPT
2911 #ifdef HALF_POP_WARNINGS
2912 #pragma warning(pop)
2913 #undef HALF_POP_WARNINGS