8#include <QtCore/qglobal.h>
9#include <QtCore/qmath.h>
10#include <QtCore/qnamespace.h>
14#if defined(__STDCPP_FLOAT16_T__) && __has_include(<stdfloat>)
19#if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__AVX2__) && !defined(__F16C__)
24# if defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
29#if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__F16C__)
36#pragma qt_class(QFloat16)
37#pragma qt_no_master_include
40#ifndef QT_NO_DATASTREAM
56#if defined(__STDCPP_FLOAT16_T__)
57# define QFLOAT16_IS_NATIVE 1
59#elif defined(Q_CC_CLANG) && defined(__FLT16_MAX__) && 0
61# define QFLOAT16_IS_NATIVE 1
63#elif defined(Q_CC_GNU_ONLY) && defined(__FLT16_MAX__)
64# define QFLOAT16_IS_NATIVE 1
65# ifdef __ARM_FP16_FORMAT_IEEE
71# define QFLOAT16_IS_NATIVE 0
75 using NearestFloat = std::conditional_t<IsNative, NativeType, float>;
82 constexpr operator NativeType() const noexcept {
return nf; }
85 inline operator float() const noexcept;
87 template <
typename T,
typename = std::enable_if_t<std::is_arithmetic_v<T> && !std::is_same_v<T, NearestFloat>>>
91 bool isInf() const noexcept {
return (
b16 & 0x7fff) == 0x7c00; }
92 bool isNaN() const noexcept {
return (
b16 & 0x7fff) > 0x7c00; }
93 bool isFinite() const noexcept {
return (
b16 & 0x7fff) < 0x7c00; }
106#if QT_CONFIG(signaling_nan)
107 static constexpr qfloat16 _limit_signaling_NaN() noexcept {
return qfloat16(Wrap(0x7d00)); }
110 {
return (
b16 & 0x7c00) && (
b16 & 0x7c00) != 0x7c00; }
120#if QFLOAT16_IS_NATIVE
124 constexpr inline explicit qfloat16(Wrap nibble) noexcept :
b16(nibble.b16) {}
126 Q_CORE_EXPORT
static const quint32 mantissatable[];
127 Q_CORE_EXPORT
static const quint32 exponenttable[];
128 Q_CORE_EXPORT
static const quint32 offsettable[];
129 Q_CORE_EXPORT
static const quint16 basetable[];
130 Q_CORE_EXPORT
static const quint16 shifttable[];
131 Q_CORE_EXPORT
static const quint32 roundtable[];
147#define QF16_MAKE_ARITH_OP_FP(FP, OP) \
148 friend inline FP operator OP(qfloat16 lhs, FP rhs) noexcept { return static_cast<FP>(lhs) OP rhs; } \
149 friend inline FP operator OP(FP lhs, qfloat16 rhs) noexcept { return lhs OP static_cast<FP>(rhs); }
150#define QF16_MAKE_ARITH_OP_EQ_FP(FP, OP_EQ, OP) \
151 friend inline qfloat16& operator OP_EQ(qfloat16& lhs, FP rhs) noexcept \
152 { lhs = qfloat16(NearestFloat(static_cast<FP>(lhs) OP rhs)); return lhs; }
153#define QF16_MAKE_ARITH_OP(FP) \
154 QF16_MAKE_ARITH_OP_FP(FP, +) \
155 QF16_MAKE_ARITH_OP_FP(FP, -) \
156 QF16_MAKE_ARITH_OP_FP(FP, *) \
157 QF16_MAKE_ARITH_OP_FP(FP, /) \
158 QF16_MAKE_ARITH_OP_EQ_FP(FP, +=, +) \
159 QF16_MAKE_ARITH_OP_EQ_FP(FP, -=, -) \
160 QF16_MAKE_ARITH_OP_EQ_FP(FP, *=, *) \
161 QF16_MAKE_ARITH_OP_EQ_FP(FP, /=, /)
166#if QFLOAT16_IS_NATIVE
169#undef QF16_MAKE_ARITH_OP
170#undef QF16_MAKE_ARITH_OP_FP
172#define QF16_MAKE_ARITH_OP_INT(OP) \
173 friend inline double operator OP(qfloat16 lhs, int rhs) noexcept { return static_cast<double>(lhs) OP rhs; } \
174 friend inline double operator OP(int lhs, qfloat16 rhs) noexcept { return lhs OP static_cast<double>(rhs); }
180#undef QF16_MAKE_ARITH_OP_INT
192#define QF16_MAKE_BOOL_OP_FP(FP, OP) \
193 friend inline bool operator OP(qfloat16 lhs, FP rhs) noexcept { return static_cast<FP>(lhs) OP rhs; } \
194 friend inline bool operator OP(FP lhs, qfloat16 rhs) noexcept { return lhs OP static_cast<FP>(rhs); }
195#define QF16_MAKE_BOOL_OP(FP) \
196 QF16_MAKE_BOOL_OP_FP(FP, <) \
197 QF16_MAKE_BOOL_OP_FP(FP, >) \
198 QF16_MAKE_BOOL_OP_FP(FP, >=) \
199 QF16_MAKE_BOOL_OP_FP(FP, <=) \
200 QF16_MAKE_BOOL_OP_FP(FP, ==) \
201 QF16_MAKE_BOOL_OP_FP(FP, !=)
206#undef QF16_MAKE_BOOL_OP
207#undef QF16_MAKE_BOOL_OP_FP
209#define QF16_MAKE_BOOL_OP_INT(OP) \
210 friend inline bool operator OP(qfloat16 a, int b) noexcept { return static_cast<NearestFloat>(a) OP static_cast<NearestFloat>(b); } \
211 friend inline bool operator OP(int a, qfloat16 b) noexcept { return static_cast<NearestFloat>(a) OP static_cast<NearestFloat>(b); }
219#undef QF16_MAKE_BOOL_OP_INT
223#ifndef QT_NO_DATASTREAM
245#if defined(__cpp_lib_extended_float) && defined(__STDCPP_FLOAT16_T__) && 0
249#elif QFLOAT16_IS_NATIVE && defined(__HAVE_FLOAT16) && __HAVE_FLOAT16
253 bool mathUpdatesErrno =
true;
254# if defined(__NO_MATH_ERRNO__) || defined(_M_FP_FAST)
255 mathUpdatesErrno =
false;
256# elif defined(math_errhandling)
257 mathUpdatesErrno = (math_errhandling & MATH_ERRNO);
264 if (!mathUpdatesErrno || !(0 >
f)) {
265# if defined(__AVX512FP16__)
266 __m128h
v = _mm_set_sh(
f);
267 v = _mm_sqrt_sh(
v,
v);
268 return _mm_cvtsh_h(
v);
274 float f32 = float(
f);
282{
return qRound(
static_cast<float>(
d)); }
285{
return qRound64(
static_cast<float>(
d)); }
305 return qAbs(
f) < 0.00976f;
310 return (
f.b16 &
static_cast<quint16>(0x7fff)) == 0;
316#if !defined(Q_QDOC) && !QFLOAT16_IS_NATIVE
322#if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__F16C__)
323 __m128 packsingle = _mm_set_ss(
f);
324 __m128i packhalf = _mm_cvtps_ph(packsingle, 0);
325 b16 = _mm_extract_epi16(packhalf, 0);
326#elif defined (__ARM_FP16_FORMAT_IEEE)
327 __fp16 f16 = __fp16(
f);
328 memcpy(&b16, &f16,
sizeof(
quint16));
332 const quint32 signAndExp = u >> 23;
335 const quint32 round = roundtable[signAndExp];
336 quint32 mantissa = (u & 0x007fffff);
337 if ((signAndExp & 0xff) == 0xff) {
347 if (mantissa & (1 <<
shift))
358inline qfloat16::operator float() const noexcept
360#if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__F16C__)
361 __m128i packhalf = _mm_cvtsi32_si128(b16);
362 __m128 packsingle = _mm_cvtph_ps(packhalf);
363 return _mm_cvtss_f32(packsingle);
364#elif defined (__ARM_FP16_FORMAT_IEEE)
366 memcpy(&f16, &b16,
sizeof(
quint16));
369 quint32 u = mantissatable[offsettable[b16 >> 10] + (b16 & 0x3ff)]
370 + exponenttable[b16 >> 10];
388 using type = std::conditional_t<std::is_floating_point_v<R>,
R,
double>;
399#if defined(QT_COMPILER_SUPPORTS_F16C) && defined(__F16C__) || QFLOAT16_IS_NATIVE
407template<
typename F,
typename ...Fs>
auto qHypot(F
first, Fs... rest);
412 if constexpr (std::is_floating_point_v<T>)
422#if defined(__cpp_lib_hypot) && __cpp_lib_hypot >= 201603L
427template <
typename Ty,
typename Tz,
428 typename std::enable_if<
430 !(std::is_same_v<qfloat16, Ty> && std::is_same_v<qfloat16, Tz>),
int>
::type = 0>
432template <
typename Tx,
typename Tz,
433 typename std::enable_if<
435 !std::is_same_v<qfloat16, Tx>,
int>
::type = 0>
437template <
typename Tx,
typename Ty,
438 typename std::enable_if<
440 !std::is_same_v<qfloat16, Tx> && !std::is_same_v<qfloat16, Ty>,
int>
::type = 0>
446#if (defined(QT_COMPILER_SUPPORTS_F16C) && defined(__F16C__)) || QFLOAT16_IS_NATIVE
472 static constexpr int min_exponent = -13;
473 static constexpr int max_exponent = 16;
475 static constexpr int digits10 = 3;
476 static constexpr int max_digits10 = 5;
477 static constexpr int min_exponent10 = -4;
478 static constexpr int max_exponent10 = 4;
494#if QT_CONFIG(signaling_nan)
498 static constexpr bool has_signaling_NaN =
false;
503 :
public numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> {};
505 :
public numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> {};
507 :
public numeric_limits<QT_PREPEND_NAMESPACE(qfloat16)> {};
\inmodule QtCore\reentrant
auto add(F first, Fs... rest) const
\keyword 16-bit Floating Point Support\inmodule QtCore \inheaderfile QFloat16
constexpr qfloat16() noexcept
constexpr bool isNormal() const noexcept
static constexpr qfloat16 _limit_quiet_NaN() noexcept
friend bool operator<(qfloat16 a, qfloat16 b) noexcept
friend Q_CORE_EXPORT QDataStream & operator>>(QDataStream &ds, qfloat16 &f)
friend bool operator!=(qfloat16 a, qfloat16 b) noexcept
static constexpr qfloat16 _limit_min() noexcept
bool isInf() const noexcept
friend bool operator>=(qfloat16 a, qfloat16 b) noexcept
friend bool operator==(qfloat16 a, qfloat16 b) noexcept
QT_WARNING_PUSH QT_WARNING_DISABLE_FLOAT_COMPARE friend bool operator>(qfloat16 a, qfloat16 b) noexcept
static constexpr qfloat16 _limit_infinity() noexcept
friend bool qIsNull(qfloat16 f) noexcept
static constexpr qfloat16 _limit_epsilon() noexcept
static constexpr bool IsNative
QT_WARNING_POP friend Q_CORE_EXPORT QDataStream & operator<<(QDataStream &ds, qfloat16 f)
static constexpr qfloat16 _limit_denorm_min() noexcept
bool isNaN() const noexcept
qfloat16(Qt::Initialization) noexcept
friend qfloat16 operator/(qfloat16 a, qfloat16 b) noexcept
friend bool operator<=(qfloat16 a, qfloat16 b) noexcept
friend qfloat16 operator-(qfloat16 a, qfloat16 b) noexcept
std::conditional_t< IsNative, NativeType, float > NearestFloat
Q_CORE_EXPORT int fpClassify() const noexcept
bool isFinite() const noexcept
static constexpr qfloat16 _limit_lowest() noexcept
friend qfloat16 operator+(qfloat16 a, qfloat16 b) noexcept
friend qfloat16 operator*(qfloat16 a, qfloat16 b) noexcept
friend qfloat16 operator-(qfloat16 a) noexcept
qfloat16 copySign(qfloat16 sign) const noexcept
static constexpr qfloat16 _limit_max() noexcept
constexpr qfloat16(T value) noexcept
static constexpr QT_PREPEND_NAMESPACE() qfloat16() max()
static constexpr QT_PREPEND_NAMESPACE(qfloat16) lowest()
static constexpr QT_PREPEND_NAMESPACE() qfloat16() min()
static constexpr QT_PREPEND_NAMESPACE(qfloat16) epsilon()
static constexpr QT_PREPEND_NAMESPACE(qfloat16) infinity()
static constexpr QT_PREPEND_NAMESPACE(qfloat16) quiet_NaN()
static constexpr QT_PREPEND_NAMESPACE(qfloat16) denorm_min()
Combined button and popup list for selecting options.
static QT_WARNING_DISABLE_FLOAT_COMPARE ShiftResult shift(const QBezier *orig, QBezier *shifted, qreal offset, qreal threshold)
#define QT_WARNING_DISABLE_FLOAT_COMPARE
#define QT_WARNING_DISABLE_GCC(text)
#define QT_WARNING_DISABLE_CLANG(text)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define QF16_MAKE_ARITH_OP_INT(OP)
bool qIsFinite(qfloat16 f) noexcept
#define QF16_MAKE_ARITH_OP(FP)
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
#define QF16_MAKE_BOOL_OP(FP)
Q_CORE_EXPORT void qFloatFromFloat16(float *, const qfloat16 *, qsizetype length) noexcept
bool qFuzzyIsNull(qfloat16 f) noexcept
bool qIsNaN(qfloat16 f) noexcept
int qFpClassify(qfloat16 f) noexcept
#define QF16_MAKE_BOOL_OP_INT(OP)
bool qIsInf(qfloat16 f) noexcept
auto qHypot(qfloat16 x, qfloat16 y)
bool qIsNull(qfloat16 f) noexcept
#define QFLOAT16_IS_NATIVE
Q_CORE_EXPORT void qFloatToFloat16(qfloat16 *, const float *, qsizetype length) noexcept
qfloat16 qSqrt(qfloat16 f)
qint64 qRound64(qfloat16 d) noexcept
int qRound(qfloat16 d) noexcept
int qIntCast(qfloat16 f) noexcept
constexpr const T & qMin(const T &a, const T &b)
constexpr const T & qMax(const T &a, const T &b)
constexpr T qAbs(const T &t)
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat z
GLint GLint GLint GLint GLint x
[0]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLenum GLsizei length
static const qreal epsilon
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS)
QT_END_NAMESPACE typedef QT_PREPEND_NAMESPACE(quintptr) WId
std::conditional_t< std::is_floating_point_v< R >, R, double > type
decltype(std::hypot(R(1), F(1))) type