summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/global/qglobal.cpp8
-rw-r--r--tests/auto/corelib/global/qglobal/tst_qglobal.cpp56
2 files changed, 64 insertions, 0 deletions
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index bcfc6ada2e..ee857d61ac 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -968,6 +968,8 @@ static_assert((std::is_same<qsizetype, qptrdiff>::value));
Rounds half away from zero (e.g. 0.5 -> 1, -0.5 -> -1).
+ \note This function does not guarantee correctness for high precisions.
+
Example:
\snippet code/src_corelib_global_qglobal.cpp 11A
@@ -980,6 +982,8 @@ static_assert((std::is_same<qsizetype, qptrdiff>::value));
Rounds half away from zero (e.g. 0.5f -> 1, -0.5f -> -1).
+ \note This function does not guarantee correctness for high precisions.
+
Example:
\snippet code/src_corelib_global_qglobal.cpp 11B
@@ -992,6 +996,8 @@ static_assert((std::is_same<qsizetype, qptrdiff>::value));
Rounds half away from zero (e.g. 0.5 -> 1, -0.5 -> -1).
+ \note This function does not guarantee correctness for high precisions.
+
Example:
\snippet code/src_corelib_global_qglobal.cpp 12A
@@ -1004,6 +1010,8 @@ static_assert((std::is_same<qsizetype, qptrdiff>::value));
Rounds half away from zero (e.g. 0.5f -> 1, -0.5f -> -1).
+ \note This function does not guarantee correctness for high precisions.
+
Example:
\snippet code/src_corelib_global_qglobal.cpp 12B
diff --git a/tests/auto/corelib/global/qglobal/tst_qglobal.cpp b/tests/auto/corelib/global/qglobal/tst_qglobal.cpp
index 3c4bd3840e..032567cd39 100644
--- a/tests/auto/corelib/global/qglobal/tst_qglobal.cpp
+++ b/tests/auto/corelib/global/qglobal/tst_qglobal.cpp
@@ -33,6 +33,8 @@
#include <QSysInfo>
#include <QLatin1String>
+#include <cmath>
+
class tst_QGlobal: public QObject
{
Q_OBJECT
@@ -52,6 +54,10 @@ private slots:
void buildAbiEndianness();
void testqOverload();
void testqMinMax();
+ void qRoundFloats_data();
+ void qRoundFloats();
+ void qRoundDoubles_data();
+ void qRoundDoubles();
};
extern "C" { // functions in qglobal.c
@@ -602,6 +608,56 @@ void tst_QGlobal::testqMinMax()
compare(qMax(quint64(1), ushort(2)), quint64(2));
}
+void tst_QGlobal::qRoundFloats_data()
+{
+ QTest::addColumn<float>("actual");
+ QTest::addColumn<float>("expected");
+
+ QTest::newRow("round half") << 0.5f << 1.0f;
+ QTest::newRow("round negative half") << -0.5f << -1.0f;
+ QTest::newRow("round negative") << -1.4f << -1.0f;
+ QTest::newRow("round largest representable float less than 0.5") << std::nextafter(0.5f, 0.0f) << 0.0f;
+}
+
+void tst_QGlobal::qRoundFloats() {
+ QFETCH(float, actual);
+ QFETCH(float, expected);
+
+ QEXPECT_FAIL("round largest representable float less than 0.5",
+ "We know qRound fails in this case, but decided that we value simplicity over correctness",
+ Continue);
+ QCOMPARE(qRound(actual), expected);
+
+ QEXPECT_FAIL("round largest representable float less than 0.5",
+ "We know qRound fails in this case, but decided that we value simplicity over correctness",
+ Continue);
+ QCOMPARE(qRound64(actual), expected);
+}
+
+void tst_QGlobal::qRoundDoubles_data() {
+ QTest::addColumn<double>("actual");
+ QTest::addColumn<double>("expected");
+
+ QTest::newRow("round half") << 0.5 << 1.0;
+ QTest::newRow("round negative half") << -0.5 << -1.0;
+ QTest::newRow("round negative") << -1.4 << -1.0;
+ QTest::newRow("round largest representable double less than 0.5") << std::nextafter(0.5, 0.0) << 0.0;
+}
+
+void tst_QGlobal::qRoundDoubles() {
+ QFETCH(double, actual);
+ QFETCH(double, expected);
+
+ QEXPECT_FAIL("round largest representable double less than 0.5",
+ "We know qRound fails in this case, but decided that we value simplicity over correctness",
+ Continue);
+ QCOMPARE(qRound(actual), expected);
+
+ QEXPECT_FAIL("round largest representable double less than 0.5",
+ "We know qRound fails in this case, but decided that we value simplicity over correctness",
+ Continue);
+ QCOMPARE(qRound64(actual), expected);
+}
QTEST_APPLESS_MAIN(tst_QGlobal)
#include "tst_qglobal.moc"