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:
Allan Sandfeld Jensen 2020-07-28 11:46:30 +02:00
parent f16613f7ef
commit d782df4861
2 changed files with 6 additions and 6 deletions

View File

@ -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) {}

View File

@ -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));