diff --git a/src/Math/Functions.h b/src/Math/Functions.h index 8e1e08b75..6230b4390 100644 --- a/src/Math/Functions.h +++ b/src/Math/Functions.h @@ -251,12 +251,21 @@ template Vector floor(const Vector& template inline T round(const T& a); #else template inline typename std::enable_if::value, T>::type round(T a) { + #ifndef CORRADE_TARGET_NACL_NEWLIB return std::round(a); + #else + return (a > T(0)) ? std::floor(a + T(0.5)) : std::ceil(a - T(0.5)); + #endif } template Vector round(const Vector& a) { Vector out; - for(std::size_t i = 0; i != size; ++i) + for(std::size_t i = 0; i != size; ++i) { + #ifndef CORRADE_TARGET_NACL_NEWLIB out[i] = std::round(a[i]); + #else + out[i] = round(a[i]); + #endif + } return out; } #endif diff --git a/src/Math/Test/FunctionsTest.cpp b/src/Math/Test/FunctionsTest.cpp index dc682e664..b2dd56187 100644 --- a/src/Math/Test/FunctionsTest.cpp +++ b/src/Math/Test/FunctionsTest.cpp @@ -167,6 +167,15 @@ void FunctionsTest::floor() { void FunctionsTest::round() { CORRADE_COMPARE(Math::round(2.3f), 2.0f); CORRADE_COMPARE(Math::round(Vector3(2.3f, 0.7f, 1.5f)), Vector3(2.0f, 1.0f, 2.0f)); + + /* We are working around missing std::round() in NaCl newlib, thus we must + test that the behavior is the same on both implementations */ + CORRADE_COMPARE(Math::round(-2.0f), -2.0f); + CORRADE_COMPARE(Math::round(-1.5f), -2.0f); + CORRADE_COMPARE(Math::round(-1.3f), -1.0f); + CORRADE_COMPARE(Math::round(1.3f), 1.0f); + CORRADE_COMPARE(Math::round(1.5f), 2.0f); + CORRADE_COMPARE(Math::round(2.0f), 2.0f); } void FunctionsTest::ceil() {