Make qfloat16 helper functions consistent with float/double versions
Infinite is only when the mantissa is 0, everything else is NaN. std::isnormal returns false on zero. Pick-to: 5.15 Change-Id: I897fc0dc3b8a9c557bb1922ea7ca8df501e91859 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
f16613f7ef
commit
d782df4861
@ -80,9 +80,9 @@ public:
|
||||
inline operator float() const noexcept;
|
||||
|
||||
// Support for qIs{Inf,NaN,Finite}:
|
||||
bool isInf() const noexcept { return ((b16 >> 8) & 0x7e) == 0x7c; }
|
||||
bool isNaN() const noexcept { return ((b16 >> 8) & 0x7e) == 0x7e; }
|
||||
bool isFinite() const noexcept { return ((b16 >> 8) & 0x7c) != 0x7c; }
|
||||
bool isInf() const noexcept { return (b16 & 0x7fff) == 0x7c00; }
|
||||
bool isNaN() const noexcept { return (b16 & 0x7fff) > 0x7c00; }
|
||||
bool isFinite() const noexcept { return (b16 & 0x7fff) < 0x7c00; }
|
||||
Q_CORE_EXPORT int fpClassify() const noexcept;
|
||||
// Can't specialize std::copysign() for qfloat16
|
||||
qfloat16 copySign(qfloat16 sign) const noexcept
|
||||
@ -96,10 +96,10 @@ public:
|
||||
static constexpr qfloat16 _limit_infinity() noexcept { return qfloat16(Wrap(0x7c00)); }
|
||||
static constexpr qfloat16 _limit_quiet_NaN() noexcept { return qfloat16(Wrap(0x7e00)); }
|
||||
#if QT_CONFIG(signaling_nan)
|
||||
static constexpr qfloat16 _limit_signaling_NaN() noexcept { return qfloat16(Wrap(0x7f00)); }
|
||||
static constexpr qfloat16 _limit_signaling_NaN() noexcept { return qfloat16(Wrap(0x7d00)); }
|
||||
#endif
|
||||
inline constexpr bool isNormal() const noexcept
|
||||
{ return (b16 & 0x7fff) == 0 || ((b16 & 0x7c00) && (b16 & 0x7c00) != 0x7c00); }
|
||||
{ return (b16 & 0x7c00) && (b16 & 0x7c00) != 0x7c00; }
|
||||
private:
|
||||
quint16 b16;
|
||||
constexpr inline explicit qfloat16(Wrap nibble) noexcept : b16(nibble.b16) {}
|
||||
|
@ -423,7 +423,7 @@ void tst_qfloat16::finite()
|
||||
{
|
||||
QFETCH(qfloat16, value);
|
||||
QFETCH(int, mode);
|
||||
QCOMPARE(value.isNormal(), mode != FP_SUBNORMAL);
|
||||
QCOMPARE(value.isNormal(), mode == FP_NORMAL);
|
||||
QCOMPARE(value, value); // Fuzzy
|
||||
QVERIFY(value == value); // Exact
|
||||
QVERIFY(qIsFinite(value));
|
||||
|
Loading…
x
Reference in New Issue
Block a user