29#define HALF_GNUC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
33#if __has_feature(cxx_static_assert) && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
34#define HALF_ENABLE_CPP11_STATIC_ASSERT 1
36#if __has_feature(cxx_constexpr) && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
37#define HALF_ENABLE_CPP11_CONSTEXPR 1
39#if __has_feature(cxx_noexcept) && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
40#define HALF_ENABLE_CPP11_NOEXCEPT 1
42#if __has_feature(cxx_user_literals) && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
43#define HALF_ENABLE_CPP11_USER_LITERALS 1
45#if(defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L) && !defined(HALF_ENABLE_CPP11_LONG_LONG)
46#define HALF_ENABLE_CPP11_LONG_LONG 1
61#elif defined(__GNUC__)
62#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
63#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
64#define HALF_ENABLE_CPP11_STATIC_ASSERT 1
66#if HALF_GNUC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
67#define HALF_ENABLE_CPP11_CONSTEXPR 1
69#if HALF_GNUC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
70#define HALF_ENABLE_CPP11_NOEXCEPT 1
72#if HALF_GNUC_VERSION >= 407 && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
73#define HALF_ENABLE_CPP11_USER_LITERALS 1
75#if !defined(HALF_ENABLE_CPP11_LONG_LONG)
76#define HALF_ENABLE_CPP11_LONG_LONG 1
79#elif defined(_MSC_VER)
80#if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)
81#define HALF_ENABLE_CPP11_CONSTEXPR 1
83#if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)
84#define HALF_ENABLE_CPP11_NOEXCEPT 1
86#if _MSC_VER >= 1900 && !defined(HALF_ENABLE_CPP11_USER_LITERALS)
87#define HALF_ENABLE_CPP11_USER_LITERALS 1
89#if _MSC_VER >= 1600 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)
90#define HALF_ENABLE_CPP11_STATIC_ASSERT 1
92#if _MSC_VER >= 1310 && !defined(HALF_ENABLE_CPP11_LONG_LONG)
93#define HALF_ENABLE_CPP11_LONG_LONG 1
95#define HALF_POP_WARNINGS 1
97#pragma warning(disable : 4099 4127 4146)
102#if defined(_LIBCPP_VERSION)
103#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103
104#ifndef HALF_ENABLE_CPP11_TYPE_TRAITS
105#define HALF_ENABLE_CPP11_TYPE_TRAITS 1
107#ifndef HALF_ENABLE_CPP11_CSTDINT
108#define HALF_ENABLE_CPP11_CSTDINT 1
110#ifndef HALF_ENABLE_CPP11_CMATH
111#define HALF_ENABLE_CPP11_CMATH 1
113#ifndef HALF_ENABLE_CPP11_HASH
114#define HALF_ENABLE_CPP11_HASH 1
117#elif defined(__GLIBCXX__)
118#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103
120#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_TYPE_TRAITS)
121#define HALF_ENABLE_CPP11_TYPE_TRAITS 1
123#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CSTDINT)
124#define HALF_ENABLE_CPP11_CSTDINT 1
126#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CMATH)
127#define HALF_ENABLE_CPP11_CMATH 1
129#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_HASH)
130#define HALF_ENABLE_CPP11_HASH 1
133#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CSTDINT)
134#define HALF_ENABLE_CPP11_CSTDINT 1
136#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CMATH)
137#define HALF_ENABLE_CPP11_CMATH 1
139#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_HASH)
140#define HALF_ENABLE_CPP11_HASH 1
144#elif defined(_CPPLIB_VER)
145#if _CPPLIB_VER >= 520
146#ifndef HALF_ENABLE_CPP11_TYPE_TRAITS
147#define HALF_ENABLE_CPP11_TYPE_TRAITS 1
149#ifndef HALF_ENABLE_CPP11_CSTDINT
150#define HALF_ENABLE_CPP11_CSTDINT 1
152#ifndef HALF_ENABLE_CPP11_HASH
153#define HALF_ENABLE_CPP11_HASH 1
156#if _CPPLIB_VER >= 610
157#ifndef HALF_ENABLE_CPP11_CMATH
158#define HALF_ENABLE_CPP11_CMATH 1
162#undef HALF_GNUC_VERSION
165#if HALF_ENABLE_CPP11_CONSTEXPR
166#define HALF_CONSTEXPR constexpr
167#define HALF_CONSTEXPR_CONST constexpr
169#define HALF_CONSTEXPR
170#define HALF_CONSTEXPR_CONST const
174#if HALF_ENABLE_CPP11_NOEXCEPT
175#define HALF_NOEXCEPT noexcept
176#define HALF_NOTHROW noexcept
179#define HALF_NOTHROW throw()
188#if HALF_ENABLE_CPP11_TYPE_TRAITS
189#include <type_traits>
191#if HALF_ENABLE_CPP11_CSTDINT
194#if HALF_ENABLE_CPP11_HASH
214#ifndef HALF_ROUND_STYLE
215#define HALF_ROUND_STYLE -1
223#ifndef HALF_ROUND_TIES_TO_EVEN
224#define HALF_ROUND_TIES_TO_EVEN 0
230#define HUGE_VALH std::numeric_limits<half_float::half>::infinity()
236#define FP_FAST_FMAH 1
239#define FP_ILOGB0 INT_MIN
242#define FP_ILOGBNAN INT_MAX
245#define FP_SUBNORMAL 0
266#if HALF_ENABLE_CPP11_USER_LITERALS
275half operator""_h(
long double);
283#if HALF_ENABLE_CPP11_TYPE_TRAITS
285template <
bool B,
typename T,
typename F>
292struct bool_type : std::integral_constant<bool, B>
300struct is_float : std::is_floating_point<T>
305template <
bool,
typename T,
typename>
310template <
typename T,
typename F>
374#if HALF_ENABLE_CPP11_CSTDINT
376typedef std::uint_least16_t
uint16;
382 typedef std::uint_least32_t
type;
389 typedef std::uint_least64_t
type;
397struct bits<float> :
conditional<std::numeric_limits<unsigned int>::digits >= 32, unsigned int, unsigned long>
401#if HALF_ENABLE_CPP11_LONG_LONG
404struct bits<double> :
conditional<std::numeric_limits<unsigned long>::digits >= 64, unsigned long, unsigned long long>
412 typedef unsigned long type;
446template <
typename T,
typename,
typename =
void,
typename =
void>
526template <
typename T,
typename U>
547#if HALF_ENABLE_CPP11_CMATH
549#elif defined(_MSC_VER)
550 return !::_finite(
static_cast<double>(arg)) && !::_isnan(
static_cast<double>(arg));
552 return arg == std::numeric_limits<T>::infinity() || arg == -std::numeric_limits<T>::infinity();
564#if HALF_ENABLE_CPP11_CMATH
566#elif defined(_MSC_VER)
567 return ::_isnan(
static_cast<double>(arg)) != 0;
581#if HALF_ENABLE_CPP11_CMATH
584 return arg < T() || (arg == T() && T(1) / arg < T());
597template <std::
float_round_style R>
602 std::memcpy(&
bits, &value,
sizeof(
float));
647 static const uint16 base_table[512] = {
648 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
649 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
650 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
651 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
652 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
653 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
654 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100,
655 0x0200, 0x0400, 0x0800, 0x0C00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x2400, 0x2800, 0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00,
656 0x4000, 0x4400, 0x4800, 0x4C00, 0x5000, 0x5400, 0x5800, 0x5C00, 0x6000, 0x6400, 0x6800, 0x6C00, 0x7000, 0x7400, 0x7800, 0x7C00,
657 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
658 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
659 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
660 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
661 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
662 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
663 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00,
664 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
665 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
666 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
667 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
668 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
669 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
670 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001, 0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100,
671 0x8200, 0x8400, 0x8800, 0x8C00, 0x9000, 0x9400, 0x9800, 0x9C00, 0xA000, 0xA400, 0xA800, 0xAC00, 0xB000, 0xB400, 0xB800, 0xBC00,
672 0xC000, 0xC400, 0xC800, 0xCC00, 0xD000, 0xD400, 0xD800, 0xDC00, 0xE000, 0xE400, 0xE800, 0xEC00, 0xF000, 0xF400, 0xF800, 0xFC00,
673 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
674 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
675 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
676 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
677 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
678 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00,
679 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00};
680 static const unsigned char shift_table[512] = {
681 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
682 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
683 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
684 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,
685 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,
686 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
687 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
688 24, 24, 24, 24, 24, 24, 24, 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,
689 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
690 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
691 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
692 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,
693 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,
694 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
695 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
696 24, 24, 24, 24, 24, 24, 24, 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};
698 if(R == std::round_to_nearest)
699 hbits += (((
bits & 0x7FFFFF) >> (shift_table[
bits >> 23] - 1)) | (((
bits >> 23) & 0xFF) == 102)) & ((hbits & 0x7C00) != 0x7C00)
701 & (((((
static_cast<uint32
>(1) << (shift_table[
bits >> 23] - 1)) - 1) &
bits) != 0) | hbits)
704 else if(R == std::round_toward_zero)
705 hbits -= ((hbits & 0x7FFF) == 0x7C00) & ~shift_table[
bits >> 23];
706 else if(R == std::round_toward_infinity)
707 hbits += ((((
bits & 0x7FFFFF & ((
static_cast<uint32
>(1) << (shift_table[
bits >> 23])) - 1)) != 0) |
708 (((
bits >> 23) <= 102) & ((
bits >> 23) != 0))) &
710 ((hbits == 0xFC00) & ((
bits >> 23) != 511));
711 else if(R == std::round_toward_neg_infinity)
712 hbits += ((((
bits & 0x7FFFFF & ((
static_cast<uint32
>(1) << (shift_table[
bits >> 23])) - 1)) != 0) |
713 (((
bits >> 23) <= 358) & ((
bits >> 23) != 256))) &
714 (hbits < 0xFC00) & (hbits >> 15)) -
715 ((hbits == 0x7C00) & ((
bits >> 23) != 255));
723template <std::
float_round_style R>
729 std::memcpy(&
bits, &value,
sizeof(
double));
730 uint32 hi =
bits >> 32, lo =
bits & 0xFFFFFFFF;
731 uint16 hbits = (hi >> 16) & 0x8000;
735 return hbits | 0x7C00 | (0x3FF & -
static_cast<unsigned>((
bits & 0xFFFFFFFFFFFFF) != 0));
738 if(R == std::round_toward_infinity)
739 return hbits | 0x7C00 - (hbits >> 15);
740 if(R == std::round_toward_neg_infinity)
741 return hbits | 0x7BFF + (hbits >> 15);
742 return hbits | 0x7BFF + (R != std::round_toward_zero);
748 s |= (hi & 0x1FF) != 0;
749 hbits |= ((
exp - 1008) << 10) | ((hi >> 10) & 0x3FF);
754 hi = (hi & 0xFFFFF) | 0x100000;
756 s |= (hi & ((1L << i) - 1)) != 0;
757 hbits |= hi >> (i + 1);
764 if(R == std::round_to_nearest)
765#if HALF_ROUND_TIES_TO_EVEN
766 hbits += g & (s | hbits);
770 else if(R == std::round_toward_infinity)
771 hbits += ~(hbits >> 15) & (s | g);
772 else if(R == std::round_toward_neg_infinity)
773 hbits += (hbits >> 15) & (g | s);
782template <std::
float_round_style R,
typename T>
789 return hbits | 0x7FFF;
791 return hbits | 0x7C00;
796 if(R == std::round_toward_infinity)
797 return hbits | (0x7C00 - (hbits >> 15));
798 else if(R == std::round_toward_neg_infinity)
799 return hbits | (0x7BFF + (hbits >> 15));
800 return hbits | (0x7BFF + (R != std::round_toward_zero));
807 hbits |= ((
exp + 13) << 10);
811 if(R == std::round_to_nearest)
814#if HALF_ROUND_TIES_TO_EVEN
815 hbits += (frac > T(0.5)) | ((frac == T(0.5)) & hbits);
817 hbits += frac >= T(0.5);
820 else if(R == std::round_toward_infinity)
822 else if(R == std::round_toward_neg_infinity)
832template <std::
float_round_style R,
typename T>
835 return float2half_impl<R>(value,
bool_type < std::numeric_limits<T>::is_iec559 &&
sizeof(
typename bits<T>::type) ==
sizeof(T) > ());
844template <std::
float_round_style R,
bool S,
typename T>
847#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
848 static_assert(std::is_integral<T>::value,
"int to half conversion only supports builtin integer types");
855 if(R == std::round_toward_infinity)
857 else if(R == std::round_toward_neg_infinity)
860 bits |= 0x7BFF + (R != std::round_toward_zero);
864 unsigned int m = value,
exp = 24;
865 for(; m < 0x400; m <<= 1, --
exp)
867 for(; m > 0x7FF; m >>= 1, ++
exp)
872 if(R == std::round_to_nearest)
873 bits += (value >> (
exp - 25)) & 1
874#if HALF_ROUND_TIES_TO_EVEN
875 & (((((1 << (
exp - 25)) - 1) & value) != 0) |
bits)
878 else if(R == std::round_toward_infinity)
879 bits += ((value & ((1 << (
exp - 24)) - 1)) != 0) & !S;
880 else if(R == std::round_toward_neg_infinity)
881 bits += ((value & ((1 << (
exp - 24)) - 1)) != 0) & S;
892template <std::
float_round_style R,
typename T>
895 return (value < 0) ? int2half_impl<R, true>(value) : int2half_impl<R, false>(value);
914 static const uint32 mantissa_table[2048] = {
915 0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34A00000, 0x34C00000, 0x34E00000, 0x35000000, 0x35100000,
916 0x35200000, 0x35300000, 0x35400000, 0x35500000, 0x35600000, 0x35700000, 0x35800000, 0x35880000, 0x35900000, 0x35980000,
917 0x35A00000, 0x35A80000, 0x35B00000, 0x35B80000, 0x35C00000, 0x35C80000, 0x35D00000, 0x35D80000, 0x35E00000, 0x35E80000,
918 0x35F00000, 0x35F80000, 0x36000000, 0x36040000, 0x36080000, 0x360C0000, 0x36100000, 0x36140000, 0x36180000, 0x361C0000,
919 0x36200000, 0x36240000, 0x36280000, 0x362C0000, 0x36300000, 0x36340000, 0x36380000, 0x363C0000, 0x36400000, 0x36440000,
920 0x36480000, 0x364C0000, 0x36500000, 0x36540000, 0x36580000, 0x365C0000, 0x36600000, 0x36640000, 0x36680000, 0x366C0000,
921 0x36700000, 0x36740000, 0x36780000, 0x367C0000, 0x36800000, 0x36820000, 0x36840000, 0x36860000, 0x36880000, 0x368A0000,
922 0x368C0000, 0x368E0000, 0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369A0000, 0x369C0000, 0x369E0000,
923 0x36A00000, 0x36A20000, 0x36A40000, 0x36A60000, 0x36A80000, 0x36AA0000, 0x36AC0000, 0x36AE0000, 0x36B00000, 0x36B20000,
924 0x36B40000, 0x36B60000, 0x36B80000, 0x36BA0000, 0x36BC0000, 0x36BE0000, 0x36C00000, 0x36C20000, 0x36C40000, 0x36C60000,
925 0x36C80000, 0x36CA0000, 0x36CC0000, 0x36CE0000, 0x36D00000, 0x36D20000, 0x36D40000, 0x36D60000, 0x36D80000, 0x36DA0000,
926 0x36DC0000, 0x36DE0000, 0x36E00000, 0x36E20000, 0x36E40000, 0x36E60000, 0x36E80000, 0x36EA0000, 0x36EC0000, 0x36EE0000,
927 0x36F00000, 0x36F20000, 0x36F40000, 0x36F60000, 0x36F80000, 0x36FA0000, 0x36FC0000, 0x36FE0000, 0x37000000, 0x37010000,
928 0x37020000, 0x37030000, 0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000, 0x370A0000, 0x370B0000,
929 0x370C0000, 0x370D0000, 0x370E0000, 0x370F0000, 0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000,
930 0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371A0000, 0x371B0000, 0x371C0000, 0x371D0000, 0x371E0000, 0x371F0000,
931 0x37200000, 0x37210000, 0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000, 0x37280000, 0x37290000,
932 0x372A0000, 0x372B0000, 0x372C0000, 0x372D0000, 0x372E0000, 0x372F0000, 0x37300000, 0x37310000, 0x37320000, 0x37330000,
933 0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000, 0x373A0000, 0x373B0000, 0x373C0000, 0x373D0000,
934 0x373E0000, 0x373F0000, 0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000, 0x37460000, 0x37470000,
935 0x37480000, 0x37490000, 0x374A0000, 0x374B0000, 0x374C0000, 0x374D0000, 0x374E0000, 0x374F0000, 0x37500000, 0x37510000,
936 0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000, 0x37580000, 0x37590000, 0x375A0000, 0x375B0000,
937 0x375C0000, 0x375D0000, 0x375E0000, 0x375F0000, 0x37600000, 0x37610000, 0x37620000, 0x37630000, 0x37640000, 0x37650000,
938 0x37660000, 0x37670000, 0x37680000, 0x37690000, 0x376A0000, 0x376B0000, 0x376C0000, 0x376D0000, 0x376E0000, 0x376F0000,
939 0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000, 0x37760000, 0x37770000, 0x37780000, 0x37790000,
940 0x377A0000, 0x377B0000, 0x377C0000, 0x377D0000, 0x377E0000, 0x377F0000, 0x37800000, 0x37808000, 0x37810000, 0x37818000,
941 0x37820000, 0x37828000, 0x37830000, 0x37838000, 0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000,
942 0x37870000, 0x37878000, 0x37880000, 0x37888000, 0x37890000, 0x37898000, 0x378A0000, 0x378A8000, 0x378B0000, 0x378B8000,
943 0x378C0000, 0x378C8000, 0x378D0000, 0x378D8000, 0x378E0000, 0x378E8000, 0x378F0000, 0x378F8000, 0x37900000, 0x37908000,
944 0x37910000, 0x37918000, 0x37920000, 0x37928000, 0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000,
945 0x37960000, 0x37968000, 0x37970000, 0x37978000, 0x37980000, 0x37988000, 0x37990000, 0x37998000, 0x379A0000, 0x379A8000,
946 0x379B0000, 0x379B8000, 0x379C0000, 0x379C8000, 0x379D0000, 0x379D8000, 0x379E0000, 0x379E8000, 0x379F0000, 0x379F8000,
947 0x37A00000, 0x37A08000, 0x37A10000, 0x37A18000, 0x37A20000, 0x37A28000, 0x37A30000, 0x37A38000, 0x37A40000, 0x37A48000,
948 0x37A50000, 0x37A58000, 0x37A60000, 0x37A68000, 0x37A70000, 0x37A78000, 0x37A80000, 0x37A88000, 0x37A90000, 0x37A98000,
949 0x37AA0000, 0x37AA8000, 0x37AB0000, 0x37AB8000, 0x37AC0000, 0x37AC8000, 0x37AD0000, 0x37AD8000, 0x37AE0000, 0x37AE8000,
950 0x37AF0000, 0x37AF8000, 0x37B00000, 0x37B08000, 0x37B10000, 0x37B18000, 0x37B20000, 0x37B28000, 0x37B30000, 0x37B38000,
951 0x37B40000, 0x37B48000, 0x37B50000, 0x37B58000, 0x37B60000, 0x37B68000, 0x37B70000, 0x37B78000, 0x37B80000, 0x37B88000,
952 0x37B90000, 0x37B98000, 0x37BA0000, 0x37BA8000, 0x37BB0000, 0x37BB8000, 0x37BC0000, 0x37BC8000, 0x37BD0000, 0x37BD8000,
953 0x37BE0000, 0x37BE8000, 0x37BF0000, 0x37BF8000, 0x37C00000, 0x37C08000, 0x37C10000, 0x37C18000, 0x37C20000, 0x37C28000,
954 0x37C30000, 0x37C38000, 0x37C40000, 0x37C48000, 0x37C50000, 0x37C58000, 0x37C60000, 0x37C68000, 0x37C70000, 0x37C78000,
955 0x37C80000, 0x37C88000, 0x37C90000, 0x37C98000, 0x37CA0000, 0x37CA8000, 0x37CB0000, 0x37CB8000, 0x37CC0000, 0x37CC8000,
956 0x37CD0000, 0x37CD8000, 0x37CE0000, 0x37CE8000, 0x37CF0000, 0x37CF8000, 0x37D00000, 0x37D08000, 0x37D10000, 0x37D18000,
957 0x37D20000, 0x37D28000, 0x37D30000, 0x37D38000, 0x37D40000, 0x37D48000, 0x37D50000, 0x37D58000, 0x37D60000, 0x37D68000,
958 0x37D70000, 0x37D78000, 0x37D80000, 0x37D88000, 0x37D90000, 0x37D98000, 0x37DA0000, 0x37DA8000, 0x37DB0000, 0x37DB8000,
959 0x37DC0000, 0x37DC8000, 0x37DD0000, 0x37DD8000, 0x37DE0000, 0x37DE8000, 0x37DF0000, 0x37DF8000, 0x37E00000, 0x37E08000,
960 0x37E10000, 0x37E18000, 0x37E20000, 0x37E28000, 0x37E30000, 0x37E38000, 0x37E40000, 0x37E48000, 0x37E50000, 0x37E58000,
961 0x37E60000, 0x37E68000, 0x37E70000, 0x37E78000, 0x37E80000, 0x37E88000, 0x37E90000, 0x37E98000, 0x37EA0000, 0x37EA8000,
962 0x37EB0000, 0x37EB8000, 0x37EC0000, 0x37EC8000, 0x37ED0000, 0x37ED8000, 0x37EE0000, 0x37EE8000, 0x37EF0000, 0x37EF8000,
963 0x37F00000, 0x37F08000, 0x37F10000, 0x37F18000, 0x37F20000, 0x37F28000, 0x37F30000, 0x37F38000, 0x37F40000, 0x37F48000,
964 0x37F50000, 0x37F58000, 0x37F60000, 0x37F68000, 0x37F70000, 0x37F78000, 0x37F80000, 0x37F88000, 0x37F90000, 0x37F98000,
965 0x37FA0000, 0x37FA8000, 0x37FB0000, 0x37FB8000, 0x37FC0000, 0x37FC8000, 0x37FD0000, 0x37FD8000, 0x37FE0000, 0x37FE8000,
966 0x37FF0000, 0x37FF8000, 0x38000000, 0x38004000, 0x38008000, 0x3800C000, 0x38010000, 0x38014000, 0x38018000, 0x3801C000,
967 0x38020000, 0x38024000, 0x38028000, 0x3802C000, 0x38030000, 0x38034000, 0x38038000, 0x3803C000, 0x38040000, 0x38044000,
968 0x38048000, 0x3804C000, 0x38050000, 0x38054000, 0x38058000, 0x3805C000, 0x38060000, 0x38064000, 0x38068000, 0x3806C000,
969 0x38070000, 0x38074000, 0x38078000, 0x3807C000, 0x38080000, 0x38084000, 0x38088000, 0x3808C000, 0x38090000, 0x38094000,
970 0x38098000, 0x3809C000, 0x380A0000, 0x380A4000, 0x380A8000, 0x380AC000, 0x380B0000, 0x380B4000, 0x380B8000, 0x380BC000,
971 0x380C0000, 0x380C4000, 0x380C8000, 0x380CC000, 0x380D0000, 0x380D4000, 0x380D8000, 0x380DC000, 0x380E0000, 0x380E4000,
972 0x380E8000, 0x380EC000, 0x380F0000, 0x380F4000, 0x380F8000, 0x380FC000, 0x38100000, 0x38104000, 0x38108000, 0x3810C000,
973 0x38110000, 0x38114000, 0x38118000, 0x3811C000, 0x38120000, 0x38124000, 0x38128000, 0x3812C000, 0x38130000, 0x38134000,
974 0x38138000, 0x3813C000, 0x38140000, 0x38144000, 0x38148000, 0x3814C000, 0x38150000, 0x38154000, 0x38158000, 0x3815C000,
975 0x38160000, 0x38164000, 0x38168000, 0x3816C000, 0x38170000, 0x38174000, 0x38178000, 0x3817C000, 0x38180000, 0x38184000,
976 0x38188000, 0x3818C000, 0x38190000, 0x38194000, 0x38198000, 0x3819C000, 0x381A0000, 0x381A4000, 0x381A8000, 0x381AC000,
977 0x381B0000, 0x381B4000, 0x381B8000, 0x381BC000, 0x381C0000, 0x381C4000, 0x381C8000, 0x381CC000, 0x381D0000, 0x381D4000,
978 0x381D8000, 0x381DC000, 0x381E0000, 0x381E4000, 0x381E8000, 0x381EC000, 0x381F0000, 0x381F4000, 0x381F8000, 0x381FC000,
979 0x38200000, 0x38204000, 0x38208000, 0x3820C000, 0x38210000, 0x38214000, 0x38218000, 0x3821C000, 0x38220000, 0x38224000,
980 0x38228000, 0x3822C000, 0x38230000, 0x38234000, 0x38238000, 0x3823C000, 0x38240000, 0x38244000, 0x38248000, 0x3824C000,
981 0x38250000, 0x38254000, 0x38258000, 0x3825C000, 0x38260000, 0x38264000, 0x38268000, 0x3826C000, 0x38270000, 0x38274000,
982 0x38278000, 0x3827C000, 0x38280000, 0x38284000, 0x38288000, 0x3828C000, 0x38290000, 0x38294000, 0x38298000, 0x3829C000,
983 0x382A0000, 0x382A4000, 0x382A8000, 0x382AC000, 0x382B0000, 0x382B4000, 0x382B8000, 0x382BC000, 0x382C0000, 0x382C4000,
984 0x382C8000, 0x382CC000, 0x382D0000, 0x382D4000, 0x382D8000, 0x382DC000, 0x382E0000, 0x382E4000, 0x382E8000, 0x382EC000,
985 0x382F0000, 0x382F4000, 0x382F8000, 0x382FC000, 0x38300000, 0x38304000, 0x38308000, 0x3830C000, 0x38310000, 0x38314000,
986 0x38318000, 0x3831C000, 0x38320000, 0x38324000, 0x38328000, 0x3832C000, 0x38330000, 0x38334000, 0x38338000, 0x3833C000,
987 0x38340000, 0x38344000, 0x38348000, 0x3834C000, 0x38350000, 0x38354000, 0x38358000, 0x3835C000, 0x38360000, 0x38364000,
988 0x38368000, 0x3836C000, 0x38370000, 0x38374000, 0x38378000, 0x3837C000, 0x38380000, 0x38384000, 0x38388000, 0x3838C000,
989 0x38390000, 0x38394000, 0x38398000, 0x3839C000, 0x383A0000, 0x383A4000, 0x383A8000, 0x383AC000, 0x383B0000, 0x383B4000,
990 0x383B8000, 0x383BC000, 0x383C0000, 0x383C4000, 0x383C8000, 0x383CC000, 0x383D0000, 0x383D4000, 0x383D8000, 0x383DC000,
991 0x383E0000, 0x383E4000, 0x383E8000, 0x383EC000, 0x383F0000, 0x383F4000, 0x383F8000, 0x383FC000, 0x38400000, 0x38404000,
992 0x38408000, 0x3840C000, 0x38410000, 0x38414000, 0x38418000, 0x3841C000, 0x38420000, 0x38424000, 0x38428000, 0x3842C000,
993 0x38430000, 0x38434000, 0x38438000, 0x3843C000, 0x38440000, 0x38444000, 0x38448000, 0x3844C000, 0x38450000, 0x38454000,
994 0x38458000, 0x3845C000, 0x38460000, 0x38464000, 0x38468000, 0x3846C000, 0x38470000, 0x38474000, 0x38478000, 0x3847C000,
995 0x38480000, 0x38484000, 0x38488000, 0x3848C000, 0x38490000, 0x38494000, 0x38498000, 0x3849C000, 0x384A0000, 0x384A4000,
996 0x384A8000, 0x384AC000, 0x384B0000, 0x384B4000, 0x384B8000, 0x384BC000, 0x384C0000, 0x384C4000, 0x384C8000, 0x384CC000,
997 0x384D0000, 0x384D4000, 0x384D8000, 0x384DC000, 0x384E0000, 0x384E4000, 0x384E8000, 0x384EC000, 0x384F0000, 0x384F4000,
998 0x384F8000, 0x384FC000, 0x38500000, 0x38504000, 0x38508000, 0x3850C000, 0x38510000, 0x38514000, 0x38518000, 0x3851C000,
999 0x38520000, 0x38524000, 0x38528000, 0x3852C000, 0x38530000, 0x38534000, 0x38538000, 0x3853C000, 0x38540000, 0x38544000,
1000 0x38548000, 0x3854C000, 0x38550000, 0x38554000, 0x38558000, 0x3855C000, 0x38560000, 0x38564000, 0x38568000, 0x3856C000,
1001 0x38570000, 0x38574000, 0x38578000, 0x3857C000, 0x38580000, 0x38584000, 0x38588000, 0x3858C000, 0x38590000, 0x38594000,
1002 0x38598000, 0x3859C000, 0x385A0000, 0x385A4000, 0x385A8000, 0x385AC000, 0x385B0000, 0x385B4000, 0x385B8000, 0x385BC000,
1003 0x385C0000, 0x385C4000, 0x385C8000, 0x385CC000, 0x385D0000, 0x385D4000, 0x385D8000, 0x385DC000, 0x385E0000, 0x385E4000,
1004 0x385E8000, 0x385EC000, 0x385F0000, 0x385F4000, 0x385F8000, 0x385FC000, 0x38600000, 0x38604000, 0x38608000, 0x3860C000,
1005 0x38610000, 0x38614000, 0x38618000, 0x3861C000, 0x38620000, 0x38624000, 0x38628000, 0x3862C000, 0x38630000, 0x38634000,
1006 0x38638000, 0x3863C000, 0x38640000, 0x38644000, 0x38648000, 0x3864C000, 0x38650000, 0x38654000, 0x38658000, 0x3865C000,
1007 0x38660000, 0x38664000, 0x38668000, 0x3866C000, 0x38670000, 0x38674000, 0x38678000, 0x3867C000, 0x38680000, 0x38684000,
1008 0x38688000, 0x3868C000, 0x38690000, 0x38694000, 0x38698000, 0x3869C000, 0x386A0000, 0x386A4000, 0x386A8000, 0x386AC000,
1009 0x386B0000, 0x386B4000, 0x386B8000, 0x386BC000, 0x386C0000, 0x386C4000, 0x386C8000, 0x386CC000, 0x386D0000, 0x386D4000,
1010 0x386D8000, 0x386DC000, 0x386E0000, 0x386E4000, 0x386E8000, 0x386EC000, 0x386F0000, 0x386F4000, 0x386F8000, 0x386FC000,
1011 0x38700000, 0x38704000, 0x38708000, 0x3870C000, 0x38710000, 0x38714000, 0x38718000, 0x3871C000, 0x38720000, 0x38724000,
1012 0x38728000, 0x3872C000, 0x38730000, 0x38734000, 0x38738000, 0x3873C000, 0x38740000, 0x38744000, 0x38748000, 0x3874C000,
1013 0x38750000, 0x38754000, 0x38758000, 0x3875C000, 0x38760000, 0x38764000, 0x38768000, 0x3876C000, 0x38770000, 0x38774000,
1014 0x38778000, 0x3877C000, 0x38780000, 0x38784000, 0x38788000, 0x3878C000, 0x38790000, 0x38794000, 0x38798000, 0x3879C000,
1015 0x387A0000, 0x387A4000, 0x387A8000, 0x387AC000, 0x387B0000, 0x387B4000, 0x387B8000, 0x387BC000, 0x387C0000, 0x387C4000,
1016 0x387C8000, 0x387CC000, 0x387D0000, 0x387D4000, 0x387D8000, 0x387DC000, 0x387E0000, 0x387E4000, 0x387E8000, 0x387EC000,
1017 0x387F0000, 0x387F4000, 0x387F8000, 0x387FC000, 0x38000000, 0x38002000, 0x38004000, 0x38006000, 0x38008000, 0x3800A000,
1018 0x3800C000, 0x3800E000, 0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801A000, 0x3801C000, 0x3801E000,
1019 0x38020000, 0x38022000, 0x38024000, 0x38026000, 0x38028000, 0x3802A000, 0x3802C000, 0x3802E000, 0x38030000, 0x38032000,
1020 0x38034000, 0x38036000, 0x38038000, 0x3803A000, 0x3803C000, 0x3803E000, 0x38040000, 0x38042000, 0x38044000, 0x38046000,
1021 0x38048000, 0x3804A000, 0x3804C000, 0x3804E000, 0x38050000, 0x38052000, 0x38054000, 0x38056000, 0x38058000, 0x3805A000,
1022 0x3805C000, 0x3805E000, 0x38060000, 0x38062000, 0x38064000, 0x38066000, 0x38068000, 0x3806A000, 0x3806C000, 0x3806E000,
1023 0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807A000, 0x3807C000, 0x3807E000, 0x38080000, 0x38082000,
1024 0x38084000, 0x38086000, 0x38088000, 0x3808A000, 0x3808C000, 0x3808E000, 0x38090000, 0x38092000, 0x38094000, 0x38096000,
1025 0x38098000, 0x3809A000, 0x3809C000, 0x3809E000, 0x380A0000, 0x380A2000, 0x380A4000, 0x380A6000, 0x380A8000, 0x380AA000,
1026 0x380AC000, 0x380AE000, 0x380B0000, 0x380B2000, 0x380B4000, 0x380B6000, 0x380B8000, 0x380BA000, 0x380BC000, 0x380BE000,
1027 0x380C0000, 0x380C2000, 0x380C4000, 0x380C6000, 0x380C8000, 0x380CA000, 0x380CC000, 0x380CE000, 0x380D0000, 0x380D2000,
1028 0x380D4000, 0x380D6000, 0x380D8000, 0x380DA000, 0x380DC000, 0x380DE000, 0x380E0000, 0x380E2000, 0x380E4000, 0x380E6000,
1029 0x380E8000, 0x380EA000, 0x380EC000, 0x380EE000, 0x380F0000, 0x380F2000, 0x380F4000, 0x380F6000, 0x380F8000, 0x380FA000,
1030 0x380FC000, 0x380FE000, 0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810A000, 0x3810C000, 0x3810E000,
1031 0x38110000, 0x38112000, 0x38114000, 0x38116000, 0x38118000, 0x3811A000, 0x3811C000, 0x3811E000, 0x38120000, 0x38122000,
1032 0x38124000, 0x38126000, 0x38128000, 0x3812A000, 0x3812C000, 0x3812E000, 0x38130000, 0x38132000, 0x38134000, 0x38136000,
1033 0x38138000, 0x3813A000, 0x3813C000, 0x3813E000, 0x38140000, 0x38142000, 0x38144000, 0x38146000, 0x38148000, 0x3814A000,
1034 0x3814C000, 0x3814E000, 0x38150000, 0x38152000, 0x38154000, 0x38156000, 0x38158000, 0x3815A000, 0x3815C000, 0x3815E000,
1035 0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816A000, 0x3816C000, 0x3816E000, 0x38170000, 0x38172000,
1036 0x38174000, 0x38176000, 0x38178000, 0x3817A000, 0x3817C000, 0x3817E000, 0x38180000, 0x38182000, 0x38184000, 0x38186000,
1037 0x38188000, 0x3818A000, 0x3818C000, 0x3818E000, 0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819A000,
1038 0x3819C000, 0x3819E000, 0x381A0000, 0x381A2000, 0x381A4000, 0x381A6000, 0x381A8000, 0x381AA000, 0x381AC000, 0x381AE000,
1039 0x381B0000, 0x381B2000, 0x381B4000, 0x381B6000, 0x381B8000, 0x381BA000, 0x381BC000, 0x381BE000, 0x381C0000, 0x381C2000,
1040 0x381C4000, 0x381C6000, 0x381C8000, 0x381CA000, 0x381CC000, 0x381CE000, 0x381D0000, 0x381D2000, 0x381D4000, 0x381D6000,
1041 0x381D8000, 0x381DA000, 0x381DC000, 0x381DE000, 0x381E0000, 0x381E2000, 0x381E4000, 0x381E6000, 0x381E8000, 0x381EA000,
1042 0x381EC000, 0x381EE000, 0x381F0000, 0x381F2000, 0x381F4000, 0x381F6000, 0x381F8000, 0x381FA000, 0x381FC000, 0x381FE000,
1043 0x38200000, 0x38202000, 0x38204000, 0x38206000, 0x38208000, 0x3820A000, 0x3820C000, 0x3820E000, 0x38210000, 0x38212000,
1044 0x38214000, 0x38216000, 0x38218000, 0x3821A000, 0x3821C000, 0x3821E000, 0x38220000, 0x38222000, 0x38224000, 0x38226000,
1045 0x38228000, 0x3822A000, 0x3822C000, 0x3822E000, 0x38230000, 0x38232000, 0x38234000, 0x38236000, 0x38238000, 0x3823A000,
1046 0x3823C000, 0x3823E000, 0x38240000, 0x38242000, 0x38244000, 0x38246000, 0x38248000, 0x3824A000, 0x3824C000, 0x3824E000,
1047 0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825A000, 0x3825C000, 0x3825E000, 0x38260000, 0x38262000,
1048 0x38264000, 0x38266000, 0x38268000, 0x3826A000, 0x3826C000, 0x3826E000, 0x38270000, 0x38272000, 0x38274000, 0x38276000,
1049 0x38278000, 0x3827A000, 0x3827C000, 0x3827E000, 0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828A000,
1050 0x3828C000, 0x3828E000, 0x38290000, 0x38292000, 0x38294000, 0x38296000, 0x38298000, 0x3829A000, 0x3829C000, 0x3829E000,
1051 0x382A0000, 0x382A2000, 0x382A4000, 0x382A6000, 0x382A8000, 0x382AA000, 0x382AC000, 0x382AE000, 0x382B0000, 0x382B2000,
1052 0x382B4000, 0x382B6000, 0x382B8000, 0x382BA000, 0x382BC000, 0x382BE000, 0x382C0000, 0x382C2000, 0x382C4000, 0x382C6000,
1053 0x382C8000, 0x382CA000, 0x382CC000, 0x382CE000, 0x382D0000, 0x382D2000, 0x382D4000, 0x382D6000, 0x382D8000, 0x382DA000,
1054 0x382DC000, 0x382DE000, 0x382E0000, 0x382E2000, 0x382E4000, 0x382E6000, 0x382E8000, 0x382EA000, 0x382EC000, 0x382EE000,
1055 0x382F0000, 0x382F2000, 0x382F4000, 0x382F6000, 0x382F8000, 0x382FA000, 0x382FC000, 0x382FE000, 0x38300000, 0x38302000,
1056 0x38304000, 0x38306000, 0x38308000, 0x3830A000, 0x3830C000, 0x3830E000, 0x38310000, 0x38312000, 0x38314000, 0x38316000,
1057 0x38318000, 0x3831A000, 0x3831C000, 0x3831E000, 0x38320000, 0x38322000, 0x38324000, 0x38326000, 0x38328000, 0x3832A000,
1058 0x3832C000, 0x3832E000, 0x38330000, 0x38332000, 0x38334000, 0x38336000, 0x38338000, 0x3833A000, 0x3833C000, 0x3833E000,
1059 0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834A000, 0x3834C000, 0x3834E000, 0x38350000, 0x38352000,
1060 0x38354000, 0x38356000, 0x38358000, 0x3835A000, 0x3835C000, 0x3835E000, 0x38360000, 0x38362000, 0x38364000, 0x38366000,
1061 0x38368000, 0x3836A000, 0x3836C000, 0x3836E000, 0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837A000,
1062 0x3837C000, 0x3837E000, 0x38380000, 0x38382000, 0x38384000, 0x38386000, 0x38388000, 0x3838A000, 0x3838C000, 0x3838E000,
1063 0x38390000, 0x38392000, 0x38394000, 0x38396000, 0x38398000, 0x3839A000, 0x3839C000, 0x3839E000, 0x383A0000, 0x383A2000,
1064 0x383A4000, 0x383A6000, 0x383A8000, 0x383AA000, 0x383AC000, 0x383AE000, 0x383B0000, 0x383B2000, 0x383B4000, 0x383B6000,
1065 0x383B8000, 0x383BA000, 0x383BC000, 0x383BE000, 0x383C0000, 0x383C2000, 0x383C4000, 0x383C6000, 0x383C8000, 0x383CA000,
1066 0x383CC000, 0x383CE000, 0x383D0000, 0x383D2000, 0x383D4000, 0x383D6000, 0x383D8000, 0x383DA000, 0x383DC000, 0x383DE000,
1067 0x383E0000, 0x383E2000, 0x383E4000, 0x383E6000, 0x383E8000, 0x383EA000, 0x383EC000, 0x383EE000, 0x383F0000, 0x383F2000,
1068 0x383F4000, 0x383F6000, 0x383F8000, 0x383FA000, 0x383FC000, 0x383FE000, 0x38400000, 0x38402000, 0x38404000, 0x38406000,
1069 0x38408000, 0x3840A000, 0x3840C000, 0x3840E000, 0x38410000, 0x38412000, 0x38414000, 0x38416000, 0x38418000, 0x3841A000,
1070 0x3841C000, 0x3841E000, 0x38420000, 0x38422000, 0x38424000, 0x38426000, 0x38428000, 0x3842A000, 0x3842C000, 0x3842E000,
1071 0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843A000, 0x3843C000, 0x3843E000, 0x38440000, 0x38442000,
1072 0x38444000, 0x38446000, 0x38448000, 0x3844A000, 0x3844C000, 0x3844E000, 0x38450000, 0x38452000, 0x38454000, 0x38456000,
1073 0x38458000, 0x3845A000, 0x3845C000, 0x3845E000, 0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846A000,
1074 0x3846C000, 0x3846E000, 0x38470000, 0x38472000, 0x38474000, 0x38476000, 0x38478000, 0x3847A000, 0x3847C000, 0x3847E000,
1075 0x38480000, 0x38482000, 0x38484000, 0x38486000, 0x38488000, 0x3848A000, 0x3848C000, 0x3848E000, 0x38490000, 0x38492000,
1076 0x38494000, 0x38496000, 0x38498000, 0x3849A000, 0x3849C000, 0x3849E000, 0x384A0000, 0x384A2000, 0x384A4000, 0x384A6000,
1077 0x384A8000, 0x384AA000, 0x384AC000, 0x384AE000, 0x384B0000, 0x384B2000, 0x384B4000, 0x384B6000, 0x384B8000, 0x384BA000,
1078 0x384BC000, 0x384BE000, 0x384C0000, 0x384C2000, 0x384C4000, 0x384C6000, 0x384C8000, 0x384CA000, 0x384CC000, 0x384CE000,
1079 0x384D0000, 0x384D2000, 0x384D4000, 0x384D6000, 0x384D8000, 0x384DA000, 0x384DC000, 0x384DE000, 0x384E0000, 0x384E2000,
1080 0x384E4000, 0x384E6000, 0x384E8000, 0x384EA000, 0x384EC000, 0x384EE000, 0x384F0000, 0x384F2000, 0x384F4000, 0x384F6000,
1081 0x384F8000, 0x384FA000, 0x384FC000, 0x384FE000, 0x38500000, 0x38502000, 0x38504000, 0x38506000, 0x38508000, 0x3850A000,
1082 0x3850C000, 0x3850E000, 0x38510000, 0x38512000, 0x38514000, 0x38516000, 0x38518000, 0x3851A000, 0x3851C000, 0x3851E000,
1083 0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852A000, 0x3852C000, 0x3852E000, 0x38530000, 0x38532000,
1084 0x38534000, 0x38536000, 0x38538000, 0x3853A000, 0x3853C000, 0x3853E000, 0x38540000, 0x38542000, 0x38544000, 0x38546000,
1085 0x38548000, 0x3854A000, 0x3854C000, 0x3854E000, 0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855A000,
1086 0x3855C000, 0x3855E000, 0x38560000, 0x38562000, 0x38564000, 0x38566000, 0x38568000, 0x3856A000, 0x3856C000, 0x3856E000,
1087 0x38570000, 0x38572000, 0x38574000, 0x38576000, 0x38578000, 0x3857A000, 0x3857C000, 0x3857E000, 0x38580000, 0x38582000,
1088 0x38584000, 0x38586000, 0x38588000, 0x3858A000, 0x3858C000, 0x3858E000, 0x38590000, 0x38592000, 0x38594000, 0x38596000,
1089 0x38598000, 0x3859A000, 0x3859C000, 0x3859E000, 0x385A0000, 0x385A2000, 0x385A4000, 0x385A6000, 0x385A8000, 0x385AA000,
1090 0x385AC000, 0x385AE000, 0x385B0000, 0x385B2000, 0x385B4000, 0x385B6000, 0x385B8000, 0x385BA000, 0x385BC000, 0x385BE000,
1091 0x385C0000, 0x385C2000, 0x385C4000, 0x385C6000, 0x385C8000, 0x385CA000, 0x385CC000, 0x385CE000, 0x385D0000, 0x385D2000,
1092 0x385D4000, 0x385D6000, 0x385D8000, 0x385DA000, 0x385DC000, 0x385DE000, 0x385E0000, 0x385E2000, 0x385E4000, 0x385E6000,
1093 0x385E8000, 0x385EA000, 0x385EC000, 0x385EE000, 0x385F0000, 0x385F2000, 0x385F4000, 0x385F6000, 0x385F8000, 0x385FA000,
1094 0x385FC000, 0x385FE000, 0x38600000, 0x38602000, 0x38604000, 0x38606000, 0x38608000, 0x3860A000, 0x3860C000, 0x3860E000,
1095 0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861A000, 0x3861C000, 0x3861E000, 0x38620000, 0x38622000,
1096 0x38624000, 0x38626000, 0x38628000, 0x3862A000, 0x3862C000, 0x3862E000, 0x38630000, 0x38632000, 0x38634000, 0x38636000,
1097 0x38638000, 0x3863A000, 0x3863C000, 0x3863E000, 0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864A000,
1098 0x3864C000, 0x3864E000, 0x38650000, 0x38652000, 0x38654000, 0x38656000, 0x38658000, 0x3865A000, 0x3865C000, 0x3865E000,
1099 0x38660000, 0x38662000, 0x38664000, 0x38666000, 0x38668000, 0x3866A000, 0x3866C000, 0x3866E000, 0x38670000, 0x38672000,
1100 0x38674000, 0x38676000, 0x38678000, 0x3867A000, 0x3867C000, 0x3867E000, 0x38680000, 0x38682000, 0x38684000, 0x38686000,
1101 0x38688000, 0x3868A000, 0x3868C000, 0x3868E000, 0x38690000, 0x38692000, 0x38694000, 0x38696000, 0x38698000, 0x3869A000,
1102 0x3869C000, 0x3869E000, 0x386A0000, 0x386A2000, 0x386A4000, 0x386A6000, 0x386A8000, 0x386AA000, 0x386AC000, 0x386AE000,
1103 0x386B0000, 0x386B2000, 0x386B4000, 0x386B6000, 0x386B8000, 0x386BA000, 0x386BC000, 0x386BE000, 0x386C0000, 0x386C2000,
1104 0x386C4000, 0x386C6000, 0x386C8000, 0x386CA000, 0x386CC000, 0x386CE000, 0x386D0000, 0x386D2000, 0x386D4000, 0x386D6000,
1105 0x386D8000, 0x386DA000, 0x386DC000, 0x386DE000, 0x386E0000, 0x386E2000, 0x386E4000, 0x386E6000, 0x386E8000, 0x386EA000,
1106 0x386EC000, 0x386EE000, 0x386F0000, 0x386F2000, 0x386F4000, 0x386F6000, 0x386F8000, 0x386FA000, 0x386FC000, 0x386FE000,
1107 0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870A000, 0x3870C000, 0x3870E000, 0x38710000, 0x38712000,
1108 0x38714000, 0x38716000, 0x38718000, 0x3871A000, 0x3871C000, 0x3871E000, 0x38720000, 0x38722000, 0x38724000, 0x38726000,
1109 0x38728000, 0x3872A000, 0x3872C000, 0x3872E000, 0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873A000,
1110 0x3873C000, 0x3873E000, 0x38740000, 0x38742000, 0x38744000, 0x38746000, 0x38748000, 0x3874A000, 0x3874C000, 0x3874E000,
1111 0x38750000, 0x38752000, 0x38754000, 0x38756000, 0x38758000, 0x3875A000, 0x3875C000, 0x3875E000, 0x38760000, 0x38762000,
1112 0x38764000, 0x38766000, 0x38768000, 0x3876A000, 0x3876C000, 0x3876E000, 0x38770000, 0x38772000, 0x38774000, 0x38776000,
1113 0x38778000, 0x3877A000, 0x3877C000, 0x3877E000, 0x38780000, 0x38782000, 0x38784000, 0x38786000, 0x38788000, 0x3878A000,
1114 0x3878C000, 0x3878E000, 0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879A000, 0x3879C000, 0x3879E000,
1115 0x387A0000, 0x387A2000, 0x387A4000, 0x387A6000, 0x387A8000, 0x387AA000, 0x387AC000, 0x387AE000, 0x387B0000, 0x387B2000,
1116 0x387B4000, 0x387B6000, 0x387B8000, 0x387BA000, 0x387BC000, 0x387BE000, 0x387C0000, 0x387C2000, 0x387C4000, 0x387C6000,
1117 0x387C8000, 0x387CA000, 0x387CC000, 0x387CE000, 0x387D0000, 0x387D2000, 0x387D4000, 0x387D6000, 0x387D8000, 0x387DA000,
1118 0x387DC000, 0x387DE000, 0x387E0000, 0x387E2000, 0x387E4000, 0x387E6000, 0x387E8000, 0x387EA000, 0x387EC000, 0x387EE000,
1119 0x387F0000, 0x387F2000, 0x387F4000, 0x387F6000, 0x387F8000, 0x387FA000, 0x387FC000, 0x387FE000};
1120 static const uint32 exponent_table[64] = {
1121 0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000, 0x03000000, 0x03800000, 0x04000000, 0x04800000,
1122 0x05000000, 0x05800000, 0x06000000, 0x06800000, 0x07000000, 0x07800000, 0x08000000, 0x08800000, 0x09000000, 0x09800000,
1123 0x0A000000, 0x0A800000, 0x0B000000, 0x0B800000, 0x0C000000, 0x0C800000, 0x0D000000, 0x0D800000, 0x0E000000, 0x0E800000,
1124 0x0F000000, 0x47800000, 0x80000000, 0x80800000, 0x81000000, 0x81800000, 0x82000000, 0x82800000, 0x83000000, 0x83800000,
1125 0x84000000, 0x84800000, 0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000, 0x88000000, 0x88800000,
1126 0x89000000, 0x89800000, 0x8A000000, 0x8A800000, 0x8B000000, 0x8B800000, 0x8C000000, 0x8C800000, 0x8D000000, 0x8D800000,
1127 0x8E000000, 0x8E800000, 0x8F000000, 0xC7800000};
1128 static const unsigned short offset_table[64] = {0, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
1129 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
1130 1024, 1024, 1024, 1024, 1024, 1024, 0, 1024, 1024, 1024, 1024, 1024, 1024,
1131 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
1132 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024};
1133 uint32
bits = mantissa_table[offset_table[value >> 10] + (value & 0x3FF)] + exponent_table[value >> 10];
1136 std::memcpy(&out, &
bits,
sizeof(
float));
1147 uint32 hi =
static_cast<uint32
>(value & 0x8000) << 16;
1148 int abs = value & 0x7FFF;
1151 hi |= 0x3F000000 <<
static_cast<unsigned>(
abs >= 0x7C00);
1152 for(;
abs < 0x400;
abs <<= 1, hi -= 0x100000)
1154 hi +=
static_cast<uint32
>(
abs) << 10;
1156 uint64
bits =
static_cast<uint64
>(hi) << 32;
1159 std::memcpy(&out, &
bits,
sizeof(
double));
1167template <
typename T>
1171 int abs = value & 0x7FFF;
1173 out = std::numeric_limits<T>::has_quiet_NaN ? std::numeric_limits<T>::quiet_NaN() : T();
1174 else if(
abs == 0x7C00)
1175 out = std::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : std::numeric_limits<T>::max();
1176 else if(
abs > 0x3FF)
1180 return (value & 0x8000) ? -out : out;
1187template <
typename T>
1200template <std::
float_round_style R,
bool E,
typename T>
1203#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
1204 static_assert(std::is_integral<T>::value,
"half to int conversion only supports builtin integer types");
1206 unsigned int e = value & 0x7FFF;
1208 return (value & 0x8000) ? std::numeric_limits<T>::min() : std::numeric_limits<T>::max();
1211 if(R == std::round_toward_infinity)
1212 return T(~(value >> 15) & (e != 0));
1213 else if(R == std::round_toward_neg_infinity)
1214 return -T(value > 0x8000);
1217 unsigned int m = (value & 0x3FF) | 0x400;
1221 if(R == std::round_to_nearest)
1222 m += (1 << (24 - e)) - (~(m >> (25 - e)) & E);
1223 else if(R == std::round_toward_infinity)
1224 m += ((value >> 15) - 1) & ((1 << (25 - e)) - 1U);
1225 else if(R == std::round_toward_neg_infinity)
1226 m += -(value >> 15) & ((1 << (25 - e)) - 1U);
1231 return (value & 0x8000) ? -
static_cast<T
>(m) :
static_cast<T
>(m);
1239template <std::
float_round_style R,
typename T>
1242 return half2int_impl<R, HALF_ROUND_TIES_TO_EVEN, T>(value);
1249template <
typename T>
1252 return half2int_impl<std::round_to_nearest, 0, T>(value);
1260template <std::
float_round_style R,
bool E>
1263 unsigned int e = value & 0x7FFF;
1268 if(R == std::round_to_nearest)
1269 result |= 0x3C00U & -(e >= (0x3800 + E));
1270 else if(R == std::round_toward_infinity)
1271 result |= 0x3C00U & -(~(value >> 15) & (e != 0));
1272 else if(R == std::round_toward_neg_infinity)
1273 result |= 0x3C00U & -(value > 0x8000);
1278 unsigned int mask = (1 << e) - 1;
1279 if(R == std::round_to_nearest)
1281 else if(R == std::round_toward_infinity)
1282 result += mask & ((value >> 15) - 1);
1283 else if(R == std::round_toward_neg_infinity)
1284 result += mask & -(value >> 15);
1294template <std::
float_round_style R>
1297 return round_half_impl<R, HALF_ROUND_TIES_TO_EVEN>(value);
1308struct unary_specialized;
1309template <
typename,
typename>
1310struct binary_specialized;
1311template <
typename,
typename, std::
float_round_style>
1340 template <
typename,
typename, std::
float_round_style>
1342 friend class std::numeric_limits<
half>;
1343#if HALF_ENABLE_CPP11_HASH
1344 friend struct std::hash<
half>;
1346#if HALF_ENABLE_CPP11_USER_LITERALS
1347 friend half literal::operator
""_h(
long double);
1367 operator float()
const {
return detail::half2float<float>(data_); }
1379 template <
typename T>
1382 return *
this +=
static_cast<float>(rhs);
1389 template <
typename T>
1392 return *
this -=
static_cast<float>(rhs);
1399 template <
typename T>
1402 return *
this *=
static_cast<float>(rhs);
1409 template <
typename T>
1412 return *
this /=
static_cast<float>(rhs);
1420 data_ = detail::float2half<round_style>(rhs);
1429 data_ = detail::float2half<round_style>(detail::half2float<float>(data_) + rhs);
1438 data_ = detail::float2half<round_style>(detail::half2float<float>(data_) - rhs);
1447 data_ = detail::float2half<round_style>(detail::half2float<float>(data_) * rhs);
1456 data_ = detail::float2half<round_style>(detail::half2float<float>(data_) / rhs);
1488 static const std::float_round_style round_style = (std::float_round_style)(
HALF_ROUND_STYLE);
1498#if HALF_ENABLE_CPP11_USER_LITERALS
1506inline half
operator""_h(
long double value) {
return half(
detail::binary, detail::float2half<half::round_style>(value)); }
1543 template <
typename charT,
typename traits>
1544 static std::basic_ostream<charT, traits> &
write(std::basic_ostream<charT, traits> &out,
float arg)
1553 template <
typename charT,
typename traits>
1554 static std::basic_istream<charT, traits> &
read(std::basic_istream<charT, traits> &in,
half &arg)
1574#if HALF_ENABLE_CPP11_CMATH
1578 return expr(std::numeric_limits<float>::quiet_NaN());
1580 if(ax >= 65536.0f || ay <
std::ldexp(1.0f, -24))
1581 return expr(std::numeric_limits<float>::quiet_NaN());
1587 float y2 = 0.5f * ay;
1605#if HALF_ENABLE_CPP11_CMATH
1609 return expr(std::numeric_limits<float>::quiet_NaN());
1612 if(ax >= 65536.0f || ay <
std::ldexp(1.0f, -24))
1613 return expr(std::numeric_limits<float>::quiet_NaN());
1617 return *quo = qsign ? -1 : 1,
expr(sign ? -0.0f : 0.0f);
1630 float y2 = 0.5f * ay;
1641 return *quo = qsign ? -cquo : cquo,
expr(sign ? -ax : ax);
1651#if HALF_ENABLE_CPP11_CMATH
1654 return expr((x <= y) ? 0.0f : (x - y));
1665#if HALF_ENABLE_CPP11_CMATH && defined(FP_FAST_FMAF)
1668 return expr(x * y + z);
1686#if HALF_ENABLE_CPP11_CMATH
1689 return expr(
static_cast<float>(
std::exp(
static_cast<double>(arg)) - 1.0));
1698#if HALF_ENABLE_CPP11_CMATH
1701 return expr(
static_cast<float>(
std::exp(arg * 0.69314718055994530941723212145818)));
1720#if HALF_ENABLE_CPP11_CMATH
1732#if HALF_ENABLE_CPP11_CMATH
1735 return expr(
static_cast<float>(
std::log(
static_cast<double>(arg)) * 1.4426950408889634073599246810019));
1749#if HALF_ENABLE_CPP11_CMATH
1755 :
static_cast<float>(
std::pow(
static_cast<double>(arg), 1.0 / 3.0)));
1765#if HALF_ENABLE_CPP11_CMATH
1769 ? std::numeric_limits<float>::infinity()
1770 :
static_cast<float>(
std::sqrt(
static_cast<double>(x) * x +
static_cast<double>(y) * y)));
1836#if HALF_ENABLE_CPP11_CMATH
1839 return expr((arg == -std::numeric_limits<float>::infinity()) ? arg
1849#if HALF_ENABLE_CPP11_CMATH
1852 return expr((arg < -1.0f) ? std::numeric_limits<float>::quiet_NaN()
1862#if HALF_ENABLE_CPP11_CMATH
1865 return expr(
static_cast<float>(0.5 *
std::log((1.0 + arg) / (1.0 - arg))));
1874#if HALF_ENABLE_CPP11_CMATH
1877 return expr(
static_cast<float>(
erf(
static_cast<double>(arg))));
1886#if HALF_ENABLE_CPP11_CMATH
1889 return expr(
static_cast<float>(1.0 -
erf(
static_cast<double>(arg))));
1898#if HALF_ENABLE_CPP11_CMATH
1902 return expr(std::numeric_limits<float>::infinity());
1907 return expr(std::numeric_limits<float>::infinity());
1908 return expr(
static_cast<float>(1.1447298858494001741434273513531 -
1911 return expr(
static_cast<float>(
lgamma(
static_cast<double>(arg))));
1920#if HALF_ENABLE_CPP11_CMATH
1924 return builtin_signbit(arg) ?
expr(-std::numeric_limits<float>::infinity()) :
expr(std::numeric_limits<float>::infinity());
1929 return expr(std::numeric_limits<float>::quiet_NaN());
1931 3.1415926535897932384626433832795 / (
std::sin(3.1415926535897932384626433832795 * f) *
std::exp(
lgamma(1.0 - arg)));
1932 return expr(
static_cast<float>((
std::fmod(i, 2.0f) == 0.0f) ? -value : value));
1963 static long lround(
half arg) {
return detail::half2int_up<long>(arg.data_); }
1973 static long lrint(
half arg) {
return detail::half2int<half::round_style, long>(arg.data_); }
1975#if HALF_ENABLE_CPP11_LONG_LONG
1979 static long long llround(
half arg) {
return detail::half2int_up<long long>(arg.data_); }
1984 static long long llrint(
half arg) {
return detail::half2int<half::round_style, long long>(arg.data_); }
1993 int m = arg.data_ & 0x7FFF, e = -14;
1994 if(m >= 0x7C00 || !m)
1995 return *
exp = 0, arg;
1996 for(; m < 0x400; m <<= 1, --e)
1998 return *
exp = e + (m >> 10),
half(
binary, (arg.data_ & 0x8000) | 0x3800 | (m & 0x3FF));
2007 unsigned int e = arg.data_ & 0x7FFF;
2009 return *iptr = arg,
half(
binary, arg.data_ & (0x8000U | -(e > 0x7C00)));
2011 return iptr->data_ = arg.data_ & 0x8000, arg;
2013 unsigned int mask = (1 << (25 - e)) - 1, m = arg.data_ & mask;
2014 iptr->data_ = arg.data_ & ~mask;
2017 for(; m < 0x400; m <<= 1, --e)
2019 return half(
binary,
static_cast<uint16>((arg.data_ & 0x8000) | (e << 10) | (m & 0x3FF)));
2028 unsigned int m = arg.data_ & 0x7FFF;
2029 if(m >= 0x7C00 || !m)
2031 for(; m < 0x400; m <<= 1, --
exp)
2034 uint16 value = arg.data_ & 0x8000;
2037 if(half::round_style == std::round_toward_zero)
2039 else if(half::round_style == std::round_toward_infinity)
2040 value |= 0x7C00 - (value >> 15);
2041 else if(half::round_style == std::round_toward_neg_infinity)
2042 value |= 0x7BFF + (value >> 15);
2047 value |= (
exp << 10) | (m & 0x3FF);
2050 m = (m & 0x3FF) | 0x400;
2051 if(half::round_style == std::round_to_nearest)
2054#if HALF_ROUND_TIES_TO_EVEN
2055 m -= (m >> (1 -
exp)) & 1;
2058 else if(half::round_style == std::round_toward_infinity)
2059 m += ((value >> 15) - 1) & ((1 << (1 -
exp)) - 1U);
2060 else if(half::round_style == std::round_toward_neg_infinity)
2061 m += -(value >> 15) & ((1 << (1 -
exp)) - 1U);
2062 value |= m >> (1 -
exp);
2064 else if(half::round_style == std::round_toward_infinity)
2065 value -= (value >> 15) - 1;
2066 else if(half::round_style == std::round_toward_neg_infinity)
2067 value += value >> 15;
2076 int abs = arg.data_ & 0x7FFF;
2081 int exp = (
abs >> 10) - 15;
2097 int abs = arg.data_ & 0x7FFF;
2102 int exp = (
abs >> 10) - 15;
2110 for(; m < 0x400; m <<= 1, --e)
2112 bits |= (e << 10) + m;
2127 uint16 fabs = from.data_ & 0x7FFF, tabs = to.data_ & 0x7FFF;
2130 if(tabs > 0x7C00 || from.data_ == to.data_ || !(
fabs | tabs))
2133 return half(
binary, (to.data_ & 0x8000) + 1);
2134 bool lt = ((
fabs == from.data_) ?
static_cast<int>(
fabs) : -
static_cast<int>(
fabs)) <
2135 ((tabs == to.data_) ?
static_cast<int>(tabs) : -
static_cast<int>(tabs));
2136 return half(
binary, from.data_ + (((from.data_ >> 15) ^
static_cast<unsigned>(lt)) << 1) - 1);
2147 long double lfrom =
static_cast<long double>(from);
2149 return half(
static_cast<float>(to));
2150 if(!(from.data_ & 0x7FFF))
2152 return half(
binary, from.data_ + (((from.data_ >> 15) ^
static_cast<unsigned>(lfrom < to)) << 1) - 1);
2167 unsigned int abs = arg.data_ & 0x7FFF;
2181 static bool isinf(
half arg) {
return (arg.data_ & 0x7FFF) == 0x7C00; }
2187 static bool isnan(
half arg) {
return (arg.data_ & 0x7FFF) > 0x7C00; }
2193 static bool isnormal(
half arg) {
return ((arg.data_ & 0x7C00) != 0) & ((arg.data_ & 0x7C00) != 0x7C00); }
2206 static bool isequal(
half x,
half y) {
return (x.data_ == y.data_ || !((x.data_ | y.data_) & 0x7FFF)) && !
isnan(x); }
2222 int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
2223 return xabs <= 0x7C00 && yabs <= 0x7C00 && (((xabs == x.data_) ? xabs : -xabs) > ((yabs == y.data_) ? yabs : -yabs));
2233 int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
2234 return xabs <= 0x7C00 && yabs <= 0x7C00 && (((xabs == x.data_) ? xabs : -xabs) >= ((yabs == y.data_) ? yabs : -yabs));
2244 int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
2245 return xabs <= 0x7C00 && yabs <= 0x7C00 && (((xabs == x.data_) ? xabs : -xabs) < ((yabs == y.data_) ? yabs : -yabs));
2255 int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
2256 return xabs <= 0x7C00 && yabs <= 0x7C00 && (((xabs == x.data_) ? xabs : -xabs) <= ((yabs == y.data_) ? yabs : -yabs));
2266 int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
2267 if(xabs > 0x7C00 || yabs > 0x7C00)
2269 int a = (xabs == x.data_) ? xabs : -xabs, b = (yabs == y.data_) ? yabs : -yabs;
2270 return a < b || a > b;
2281 static double erf(
double arg)
2284 return (arg < 0.0) ? -1.0 : 1.0;
2285 double x2 = arg * arg, ax2 = 0.147 * x2,
2286 value =
std::sqrt(1.0 -
std::exp(-x2 * (1.2732395447351626861510701069801 + ax2) / (1.0 + ax2)));
2290 static double lgamma(
double arg)
2293 for(; arg < 8.0; ++arg)
2295 double w = 1.0 / (arg * arg);
2296 return (((((((-0.02955065359477124183006535947712 * w + 0.00641025641025641025641025641026) * w +
2297 -0.00191752691752691752691752691753) *
2299 8.4175084175084175084175084175084e-4) *
2301 -5.952380952380952380952380952381e-4) *
2303 7.9365079365079365079365079365079e-4) *
2305 -0.00277777777777777777777777777778) *
2307 0.08333333333333333333333333333333) /
2309 0.91893853320467274178032973640562 -
std::log(v) - arg + (arg - 0.5) *
std::log(arg);
2315template <
typename T>
2338template <
typename T,
typename U>
2347#if HALF_ENABLE_CPP11_CMATH
2354 return expr(std::min(x, y));
2364#if HALF_ENABLE_CPP11_CMATH
2371 return expr(std::max(x, y));
2380 int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
2385 return (((xabs == x.data_) ? xabs : -xabs) > ((yabs == y.data_) ? yabs : -yabs)) ? y : x;
2389 int xabs = x.data_ & 0x7FFF, yabs = y.data_ & 0x7FFF;
2394 return (((xabs == x.data_) ? xabs : -xabs) < ((yabs == y.data_) ? yabs : -yabs)) ? y : x;
2404template <
typename T,
typename U, std::
float_round_style R = (std::
float_round_style)(HALF_ROUND_STYLE)>
2408template <
typename U, std::
float_round_style R>
2411#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
2412 static_assert(std::is_arithmetic<U>::value,
"half_cast from non-arithmetic type unsupported");
2421template <
typename T, std::
float_round_style R>
2424#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
2425 static_assert(std::is_arithmetic<T>::value,
"half_cast to non-arithmetic type unsupported");
2431 static T cast_impl(
half arg,
true_type) {
return half2float<T>(arg.data_); }
2432 static T cast_impl(
half arg,
false_type) {
return half2int<R, T>(arg.data_); }
2434template <
typename T, std::
float_round_style R>
2437#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS
2438 static_assert(std::is_arithmetic<T>::value,
"half_cast to non-arithmetic type unsupported");
2444 static T cast_impl(
float arg,
true_type) {
return static_cast<T
>(arg); }
2445 static T cast_impl(
half arg,
false_type) {
return half2int<R, T>(arg.data_); }
2447template <std::
float_round_style R>
2452template <std::
float_round_style R>
2465template <
typename T,
typename U>
2476template <
typename T,
typename U>
2487template <
typename T,
typename U>
2498template <
typename T,
typename U>
2509template <
typename T,
typename U>
2520template <
typename T,
typename U>
2534template <
typename T,
typename U>
2544template <
typename T,
typename U>
2554template <
typename T,
typename U>
2564template <
typename T,
typename U>
2573template <
typename T>
2582template <
typename T>
2596template <
typename T,
typename charT,
typename traits>
2606template <
typename charT,
typename traits>
2607std::basic_istream<charT, traits> &
operator>>(std::basic_istream<charT, traits> &in,
half &arg)
3001#if HALF_ENABLE_CPP11_LONG_LONG
3006inline long long llround(
half arg) {
return functions::llround(arg); }
3007inline long long llround(expr arg) {
return functions::llround(arg); }
3013inline long long llrint(half arg) {
return functions::llrint(arg); }
3014inline long long llrint(expr arg) {
return functions::llrint(arg); }
3255template <
typename T,
typename U>
3273template <
typename T, std::
float_round_style R,
typename U>
3281using detail::operator==;
3282using detail::operator!=;
3283using detail::operator<;
3284using detail::operator>;
3285using detail::operator<=;
3286using detail::operator>=;
3287using detail::operator+;
3288using detail::operator-;
3289using detail::operator*;
3290using detail::operator/;
3291using detail::operator<<;
3292using detail::operator>>;
3340#if HALF_ENABLE_CPP11_LONG_LONG
3341using detail::llrint;
3342using detail::llround;
3377class numeric_limits<
half_float::half> :
public numeric_limits<float>
3407 (std::numeric_limits<float>::round_style == half_float::half::round_style) ? half_float::half::round_style : round_indeterminate;
3464#if HALF_ENABLE_CPP11_HASH
3474 typedef size_t result_type;
3479 result_type operator()(argument_type arg)
const
3481 return hash<half_float::detail::uint16>()(
static_cast<unsigned>(arg.data_) & -(arg.data_ != 0x8000));
3487#undef HALF_CONSTEXPR
3488#undef HALF_CONSTEXPR_CONST
3491#ifdef HALF_POP_WARNINGS
3493#undef HALF_POP_WARNINGS
detail::enable< half &, T >::type operator-=(T rhs)
half & operator+=(float rhs)
HALF_CONSTEXPR half() HALF_NOEXCEPT
detail::enable< half &, T >::type operator+=(T rhs)
half & operator=(detail::expr rhs)
half & operator*=(float rhs)
detail::enable< half &, T >::type operator*=(T rhs)
half & operator=(float rhs)
half & operator-=(float rhs)
half & operator/=(float rhs)
detail::enable< half &, T >::type operator/=(T rhs)
static HALF_CONSTEXPR half_float::half epsilon() HALF_NOTHROW
Difference between one and next representable value.
static HALF_CONSTEXPR half_float::half max() HALF_NOTHROW
Largest finite value.
static HALF_CONSTEXPR half_float::half lowest() HALF_NOTHROW
Smallest finite value.
static HALF_CONSTEXPR half_float::half signaling_NaN() HALF_NOTHROW
Signalling NaN.
static HALF_CONSTEXPR half_float::half min() HALF_NOTHROW
Smallest positive normal value.
static HALF_CONSTEXPR half_float::half round_error() HALF_NOTHROW
Maximum rounding error.
static HALF_CONSTEXPR half_float::half infinity() HALF_NOTHROW
Positive infinity.
static HALF_CONSTEXPR half_float::half denorm_min() HALF_NOTHROW
Smallest positive subnormal value.
static HALF_CONSTEXPR half_float::half quiet_NaN() HALF_NOTHROW
Quiet NaN.
#define HALF_CONSTEXPR_CONST
#define HALF_ROUND_TIES_TO_EVEN
unsigned short uint16
Unsigned integer of (at least) 16 bits width.
expr fdim(half x, half y)
bool builtin_signbit(T arg)
T half2int_up(uint16 value)
enable< bool, T, U >::type operator>(T x, U y)
enable< expr, T, U >::type operator/(T x, U y)
bool islessgreater(half x, half y)
float half2float_impl(uint16 value, float, true_type)
bool builtin_isnan(T arg)
expr fma(half x, half y, half z)
expr fmax(expr x, expr y)
expr remainder(expr x, expr y)
uint16 float2half(T value)
uint16 float2half_impl(float value, true_type)
HALF_CONSTEXPR_CONST binary_t binary
Tag for binary construction.
expr hypot(half x, half y)
bool isless(half x, half y)
expr pow(expr base, expr exp)
expr fmod(expr x, expr y)
enable< bool, T, U >::type operator!=(T x, U y)
enable< bool, T, U >::type operator==(T x, U y)
half ldexp(half arg, int exp)
half fmax(half x, half y)
enable< expr, T, U >::type operator-(T x, U y)
expr atan2(expr x, expr y)
half modf(half arg, half *iptr)
enable< bool, T, U >::type operator>=(T x, U y)
bool_type< true > true_type
enable< expr, T, U >::type operator*(T x, U y)
half ldexp(expr arg, int exp)
std::basic_istream< charT, traits > & operator>>(std::basic_istream< charT, traits > &in, half &arg)
uint16 int2half_impl(T value)
expr atan2(half x, half y)
half modf(expr arg, half *iptr)
expr fma(expr x, expr y, expr z)
half scalbln(half arg, long exp)
expr fmod(half x, half y)
bool isgreaterequal(half x, half y)
T half2int_impl(uint16 value)
half fmin(half x, half y)
bool isunordered(half x, half y)
T half2float(uint16 value)
expr remquo(half x, half y, int *quo)
uint16 round_half_up(uint16 value)
uint16 round_half_impl(uint16 value)
expr remainder(half x, half y)
half frexp(expr arg, int *exp)
half nextafter(half from, half to)
expr fdim(expr x, expr y)
enable< expr, T, U >::type operator+(T x, U y)
bool islessequal(half x, half y)
half frexp(half arg, int *exp)
bool isgreater(half x, half y)
half copysign(half x, half y)
bool_type< false > false_type
enable< bool, T, U >::type operator<(T x, U y)
expr hypot(expr x, expr y)
uint16 round_half(uint16 value)
expr fmin(expr x, expr y)
enable< std::basic_ostream< charT, traits > &, T >::type operator<<(std::basic_ostream< charT, traits > &out, T arg)
expr pow(half base, half exp)
bool builtin_isinf(T arg)
expr remquo(expr x, expr y, int *quo)
half nexttoward(half from, long double to)
enable< bool, T, U >::type operator<=(T x, U y)
half scalbn(half arg, int exp)
static half fmin(half x, half y)
static half fmax(half x, half y)
static expr fmax(float x, float y)
static expr fmin(float x, float y)
Tag type for binary construction.
Type traits for floating point bits.
Helper for tag dispatching.
HALF_CONSTEXPR expr(float f) HALF_NOEXCEPT
Wrapper implementing unspecialized half-precision functions.
static bool isequal(half x, half y)
static half trunc(half arg)
static expr remainder(float x, float y)
static std::basic_istream< charT, traits > & read(std::basic_istream< charT, traits > &in, half &arg)
static expr atan2(float x, float y)
static bool isnotequal(half x, half y)
static half modf(half arg, half *iptr)
static expr fmod(float x, float y)
static expr acosh(float arg)
static expr minus(float x, float y)
static bool isfinite(half arg)
static expr log2(float arg)
static bool isgreaterequal(half x, half y)
static half copysign(half x, half y)
static bool isnan(half arg)
static expr log10(float arg)
static expr erfc(float arg)
static expr log1p(float arg)
static expr expm1(float arg)
static expr divides(float x, float y)
static expr asin(float arg)
static int fpclassify(half arg)
static half logb(half arg)
static expr sqrt(float arg)
static bool isless(half x, half y)
static expr exp(float arg)
static half nextafter(half from, half to)
static expr cbrt(float arg)
static expr cosh(float arg)
static bool islessequal(half x, half y)
static expr exp2(float arg)
static expr tanh(float arg)
static half ceil(half arg)
static expr tgamma(float arg)
static half scalbln(half arg, long exp)
static bool isgreater(half x, half y)
static expr plus(float x, float y)
static expr tan(float arg)
static expr pow(float base, float exp)
static bool isunordered(half x, half y)
static expr asinh(float arg)
static expr atanh(float arg)
static long lround(half arg)
static bool signbit(half arg)
static expr acos(float arg)
static expr sin(float arg)
static expr remquo(float x, float y, int *quo)
static expr multiplies(float x, float y)
static bool islessgreater(half x, half y)
static half round(half arg)
static expr log(float arg)
static half floor(half arg)
static int ilogb(half arg)
static bool isnormal(half arg)
static half frexp(half arg, int *exp)
static expr fdim(float x, float y)
static expr hypot(float x, float y)
static expr lgamma(float arg)
static long lrint(half arg)
static expr sinh(float arg)
static half nexttoward(half from, long double to)
static std::basic_ostream< charT, traits > & write(std::basic_ostream< charT, traits > &out, float arg)
static expr atan(float arg)
static bool isinf(half arg)
static expr cos(float arg)
static expr erf(float arg)
static half rint(half arg)
static expr fma(float x, float y, float z)
static half cast(half arg)
Type traits for floating point types.
static HALF_CONSTEXPR expr negate(float arg)
static expr fabs(float arg)
static HALF_CONSTEXPR half negate(half arg)
static half fabs(half arg)