diff --git a/AK/FixedPoint.h b/AK/FixedPoint.h index 2dcb78e13f..f5747415a3 100644 --- a/AK/FixedPoint.h +++ b/AK/FixedPoint.h @@ -111,7 +111,7 @@ public: // fract(m_value) >= .5? if (m_value & (1u << (precision - 1))) { // fract(m_value) > .5? - if (m_value & (radix_mask >> 2u)) { + if (m_value & (radix_mask >> 1)) { // yes: round "up"; value += 1; } else { @@ -219,7 +219,7 @@ public: // If last bit cut off is 1: if (value & (1u << (precision - 1))) { // If the bit after is 1 as well - if (value & (radix_mask >> 2u)) { + if (value & (radix_mask >> 1)) { // We round away from 0 ret.raw() += 1; } else { diff --git a/Tests/AK/TestFixedPoint.cpp b/Tests/AK/TestFixedPoint.cpp index cf7806603b..82bb6dfe5e 100644 --- a/Tests/AK/TestFixedPoint.cpp +++ b/Tests/AK/TestFixedPoint.cpp @@ -58,6 +58,9 @@ TEST_CASE(rounding) EXPECT_EQ(Type(-1.5).ceil(), Type(-1)); EXPECT_EQ(Type(-1.25).trunc(), Type(-1)); + EXPECT_EQ(Type(2.75).rint(), Type(3)); + EXPECT_EQ(Type(-1.25).rint(), Type(-1)); + EXPECT_EQ(Type(0.5).lrint(), 0); EXPECT_EQ(Type(0.5).lfloor(), 0); EXPECT_EQ(Type(0.5).lceil(), 1);