12 #ifndef OPENVDB_MATH_HALF_HAS_BEEN_INCLUDED 13 #define OPENVDB_MATH_HALF_HAS_BEEN_INCLUDED 177 #include <openvdb/version.h> 184 #elif defined(__x86_64__) 185 #include <x86intrin.h> 186 #elif defined(__F16C__) 187 #include <immintrin.h> 193 #ifdef IMATH_HALF_ENABLE_FP_EXCEPTIONS 209 #undef IMATH_HALF_USE_LOOKUP_TABLE 210 #define IMATH_HALF_NO_LOOKUP_TABLE 220 #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER 223 #define VDBB_HALF_DENORM_MIN 5.96046448e-08f 225 #define VDB_HALF_NRM_MIN 6.10351562e-05f 227 #define VDB_HALF_MIN 6.10351562e-05f 229 #define VDB_HALF_MAX 65504.0f 231 #define VDB_HALF_EPSILON 0.00097656f 234 #define VDBB_HALF_DENORM_MIN 5.96046448e-08 236 #define VDB_HALF_NRM_MIN 6.10351562e-05 238 #define VDB_HALF_MIN 6.10351562e-05f 240 #define VDB_HALF_MAX 65504.0 242 #define VDB_HALF_EPSILON 0.00097656 246 #define VDB_HALF_MANT_DIG 11 250 #define VDB_HALF_DIG 3 255 #define VDB_HALF_DECIMAL_DIG 5 257 #define VDB_HALF_RADIX 2 260 #define VDBB_HALF_DENORM_MIN_EXP -13 263 #define VDB_HALF_MAX_EXP 16 266 #define VDBB_HALF_DENORM_MIN_10_EXP -4 269 #define VDB_HALF_MAX_10_EXP 4 281 #if !defined(__cplusplus) && !defined(__CUDACC__) 283 typedef imath_half_bits_t
half;
286 #if !defined(IMATH_HALF_NO_LOOKUP_TABLE) 287 #if defined(__cplusplus) 302 #if defined(__F16C__) 310 return _mm_cvtss_f32 (_mm_cvtph_ps (_mm_set1_epi16 (h)));
312 return _cvtsh_ss (h);
314 #elif defined(IMATH_HALF_USE_LOOKUP_TABLE) && !defined(IMATH_HALF_NO_LOOKUP_TABLE) 315 return imath_half_to_float_table[h].f;
322 uint32_t hexpmant = ( (uint32_t)(h) << 17 ) >> 4;
323 v.
i = ((uint32_t)(h >> 15)) << 31;
336 else if (hexpmant != 0)
345 # if defined(_MSC_VER) 351 _BitScanReverse (&bsr, hexpmant);
353 # elif defined(__GNUC__) || defined(__clang__) 354 lc = (uint32_t) __builtin_clz (hexpmant);
357 while (0 == ((hexpmant << lc) & 0x80000000))
373 v.
i |= (hexpmant << lc);
387 static inline imath_half_bits_t
390 #if defined(__F16C__) 393 return _mm_extract_epi16 (
394 _mm_cvtps_ph (_mm_set_ss (f), (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)),
398 return _cvtss_sh (f, (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC));
402 imath_half_bits_t ret;
403 uint32_t e, m, ui, r, shift;
407 ui = (v.
i & ~0x80000000);
408 ret = ((v.
i >> 16) & 0x8000);
411 if (ui >= 0x38800000)
417 if (ui == 0x7f800000)
419 m = (ui & 0x7fffff) >> 13;
421 return ret | (uint16_t)m | (uint16_t)(m == 0);
427 # ifdef IMATH_HALF_ENABLE_FP_EXCEPTIONS 428 feraiseexcept (FE_OVERFLOW);
434 ui = ((ui + 0x00000fff + ((ui >> 13) & 1)) >> 13);
435 return ret | (uint16_t)ui;
441 # ifdef IMATH_HALF_ENABLE_FP_EXCEPTIONS 444 feraiseexcept (FE_UNDERFLOW);
452 m = 0x800000 | (ui & 0x7fffff);
453 r = m << (32 - shift);
455 if (r > 0x80000000 || (r == 0x80000000 && (ret & 0x1) != 0))
522 half() noexcept =
default;
525 half (
float f) noexcept;
528 constexpr
half (FromBitsTag, uint16_t bits) noexcept;
531 constexpr
half (
const half&) noexcept =
default;
534 constexpr
half (half&&) noexcept =
default;
537 ~half() noexcept =
default;
542 operator float()
const noexcept;
548 constexpr half
operator-()
const noexcept;
551 half& operator= (
const half& h) noexcept =
default;
554 half& operator= (half&& h) noexcept =
default;
557 half& operator= (
float f) noexcept;
560 half& operator+= (half h) noexcept;
563 half& operator+= (
float f) noexcept;
566 half& operator-= (half h) noexcept;
569 half& operator-= (
float f) noexcept;
572 half& operator*= (half h) noexcept;
575 half& operator*= (
float f) noexcept;
578 half& operator/= (half h) noexcept;
581 half& operator/= (
float f) noexcept;
588 constexpr half round (
unsigned int n)
const noexcept;
595 constexpr
bool isFinite()
const noexcept;
598 constexpr
bool isNormalized()
const noexcept;
601 constexpr
bool isDenormalized()
const noexcept;
604 constexpr
bool isZero()
const noexcept;
607 constexpr
bool isNan()
const noexcept;
610 constexpr
bool isInfinity()
const noexcept;
621 static constexpr half posInf() noexcept;
624 static constexpr half negInf() noexcept;
627 static constexpr half qNan() noexcept;
630 static constexpr half sNan() noexcept;
638 constexpr uint16_t bits()
const noexcept;
641 constexpr
void setBits (uint16_t bits) noexcept;
646 static_assert (
sizeof (
float) ==
sizeof (uint32_t),
647 "Assumption about the size of floats correct");
652 constexpr uint16_t mantissa() const noexcept;
653 constexpr uint16_t exponent() const noexcept;
662 inline half::half (
float f) noexcept
671 inline constexpr
half::half (FromBitsTag, uint16_t bits) noexcept : _h (bits)
678 inline half::operator float() const noexcept
687 inline constexpr half
688 half::round (
unsigned int n)
const noexcept
702 uint16_t s = _h & 0x8000;
703 uint16_t e = _h & 0x7fff;
735 half h (FromBits, s | e);
744 inline constexpr half
747 return half (FromBits, bits() ^ 0x8000);
751 half::operator= (
float f) noexcept
758 half::operator+= (half h) noexcept
760 *
this =
half (
float (*
this) +
float (h));
765 half::operator+= (
float f) noexcept
767 *
this =
half (
float (*
this) + f);
772 half::operator-= (half h) noexcept
774 *
this =
half (
float (*
this) -
float (h));
779 half::operator-= (
float f) noexcept
781 *
this =
half (
float (*
this) - f);
786 half::operator*= (half h) noexcept
788 *
this =
half (
float (*
this) *
float (h));
793 half::operator*= (
float f) noexcept
795 *
this =
half (
float (*
this) * f);
800 half::operator/= (half h) noexcept
802 *
this =
half (
float (*
this) /
float (h));
807 half::operator/= (
float f) noexcept
809 *
this =
half (
float (*
this) / f);
813 inline constexpr uint16_t
814 half::mantissa()
const noexcept
819 inline constexpr uint16_t
820 half::exponent()
const noexcept
822 return (_h >> 10) & 0x001f;
825 inline constexpr
bool 828 return exponent() < 31;
831 inline constexpr
bool 832 half::isNormalized() const noexcept
834 return exponent() > 0 && exponent() < 31;
837 inline constexpr
bool 838 half::isDenormalized() const noexcept
840 return exponent() == 0 && mantissa() != 0;
843 inline constexpr
bool 846 return (_h & 0x7fff) == 0;
849 inline constexpr
bool 852 return exponent() == 31 && mantissa() != 0;
855 inline constexpr
bool 856 half::isInfinity() const noexcept
858 return exponent() == 31 && mantissa() == 0;
861 inline constexpr
bool 864 return (_h & 0x8000) != 0;
867 inline constexpr half
868 half::posInf() noexcept
870 return half (FromBits, 0x7c00);
873 inline constexpr half
874 half::negInf() noexcept
876 return half (FromBits, 0xfc00);
879 inline constexpr half
880 half::qNan() noexcept
882 return half (FromBits, 0x7fff);
885 inline constexpr half
886 half::sNan() noexcept
888 return half (FromBits, 0x7dff);
891 inline constexpr uint16_t
892 half::bits() const noexcept
897 inline constexpr
void 898 half::setBits (uint16_t bits) noexcept
931 static const bool is_specialized =
true;
949 static constexpr
bool is_signed =
true;
950 static constexpr
bool is_integer =
false;
951 static constexpr
bool is_exact =
false;
967 static constexpr
bool has_infinity =
true;
968 static constexpr
bool has_quiet_NaN =
true;
969 static constexpr
bool has_signaling_NaN =
true;
970 static constexpr float_denorm_style has_denorm = denorm_present;
971 static constexpr
bool has_denorm_loss =
false;
989 static constexpr
bool is_iec559 =
false;
990 static constexpr
bool is_bounded =
false;
991 static constexpr
bool is_modulo =
false;
993 static constexpr
bool traps =
true;
994 static constexpr
bool tinyness_before =
false;
995 static constexpr float_round_style round_style = round_to_nearest;
1002 #endif // OPENVDB_MATH_HALF_HAS_BEEN_INCLUDED
bool isNegative(const Type &x)
Return true if x is less than zero.
Definition: Math.h:367
static constexpr openvdb::math::internal::half epsilon() noexcept
Definition: Half.h:953
float f
Definition: Half.h:275
static float imath_half_to_float(imath_half_bits_t h)
Definition: Half.h:300
uint32_t i
Definition: Half.h:274
OPENVDB_API std::ostream & operator<<(std::ostream &os, half h)
Output h to os, formatted as a float.
static constexpr openvdb::math::internal::half denorm_min() noexcept
Definition: Half.h:984
bool isNan(const float x)
Return true if x is a NaN (Not-A-Number) value.
Definition: Math.h:395
bool isFinite(const float x)
Return true if x is finite.
Definition: Math.h:375
static constexpr openvdb::math::internal::half max() noexcept
Definition: Half.h:937
#define VDB_HALF_DIG
Definition: Half.h:250
uint16_t imath_half_bits_t
a type for both C-only programs and C++ to use the same utilities
Definition: Half.h:279
#define VDB_HALF_MAX_10_EXP
Definition: Half.h:269
static constexpr openvdb::math::internal::half signaling_NaN() noexcept
Definition: Half.h:980
static constexpr openvdb::math::internal::half lowest()
Definition: Half.h:941
union openvdb::v12_0::math::internal::imath_half_uif imath_half_uif_t
a type for both C-only programs and C++ to use the same utilities
#define VDB_HALF_RADIX
Base of the exponent.
Definition: Half.h:257
#define VDB_HALF_MANT_DIG
Number of digits in mantissa (significand + hidden leading 1)
Definition: Half.h:246
bool isZero(const Type &x)
Return true if x is exactly equal to zero.
Definition: Math.h:337
OPENVDB_API void printBits(char c[35], float f)
OPENVDB_API std::istream & operator>>(std::istream &is, half &h)
Input h from is.
Definition: Exceptions.h:13
#define VDBB_HALF_DENORM_MIN_EXP
Definition: Half.h:260
static constexpr openvdb::math::internal::half quiet_NaN() noexcept
Definition: Half.h:976
Vec3< typename promote< T, Coord::ValueType >::type > operator-(const Vec3< T > &v0, const Coord &v1)
Allow a Coord to be subtracted from a Vec3.
Definition: Coord.h:554
#define VDB_HALF_DECIMAL_DIG
Definition: Half.h:255
imath_half_bits_t half
if we're in a C-only context, alias the half bits type to half
Definition: Half.h:283
#define VDB_HALF_MAX_EXP
Definition: Half.h:263
static constexpr openvdb::math::internal::half min() noexcept
Definition: Half.h:933
a type for both C-only programs and C++ to use the same utilities
Definition: Half.h:272
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:121
static constexpr openvdb::math::internal::half round_error() noexcept
Definition: Half.h:957
static constexpr openvdb::math::internal::half infinity() noexcept
Definition: Half.h:972
static imath_half_bits_t imath_float_to_half(float f)
Definition: Half.h:388
#define VDBB_HALF_DENORM_MIN_10_EXP
Definition: Half.h:266
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:218