diff options
author | Edward Welbourne <edward.welbourne@qt.io> | 2019-04-01 15:22:15 +0200 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2019-04-01 14:40:14 +0000 |
commit | 954b73445cfbfef01207d51d1b986c6dd796c6d0 (patch) | |
tree | ceaf9a26c330f96a795292d1620d1827144ae070 /src/corelib/tools | |
parent | e4532224145a0a72cde9b40cb7fd39011624d1c1 (diff) |
Refine underflow check in QLocaleData::convertDoubleToFloat()
A string can parse as a non-zero double that's smaller than the
smallest float yet be a faithful representation of the smallest float.
So rather than testing for non-zero doubles less than the smallest
float, test for non-zero doubles that cast to float zero; these
underflow. This means small values close below the smallest float
shall round up to it, rather than down to zero, requiring a tweak to
an existing test. Added a test for the boundary case (and tidied the
test data).
Fixes: QTBUG-74833
Change-Id: I4cb30b3c0e54683574b98253505607caaf88fbfb
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/tools')
-rw-r--r-- | src/corelib/tools/qlocale_p.h | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h index a96ecf1c1c..7487c9128c 100644 --- a/src/corelib/tools/qlocale_p.h +++ b/src/corelib/tools/qlocale_p.h @@ -252,10 +252,8 @@ public: const float huge = std::numeric_limits<float>::infinity(); return d < 0 ? -huge : huge; } - if (std::fabs(d) >= std::numeric_limits<double>::min() // i.e. d != 0 - && std::fabs(d) < std::numeric_limits<float>::min()) { - // Values smaller than std::numeric_limits<double>::min() have - // failed already; match them. + if (d != 0 && float(d) == 0) { + // Values that underflow double already failed. Match them: if (ok != 0) *ok = false; return 0; |