diff --git a/AK/StdLibExtras.h b/AK/StdLibExtras.h index 57c986c67cc..bf91f4a3879 100644 --- a/AK/StdLibExtras.h +++ b/AK/StdLibExtras.h @@ -124,7 +124,7 @@ constexpr T ceil_div(T a, U b) { static_assert(sizeof(T) == sizeof(U)); T result = a / b; - if ((a % b) != 0) + if ((a % b) != 0 && (a > 0) == (b > 0)) ++result; return result; } diff --git a/Tests/AK/TestStdLibExtras.cpp b/Tests/AK/TestStdLibExtras.cpp index 60383f37d6d..6590e20c35a 100644 --- a/Tests/AK/TestStdLibExtras.cpp +++ b/Tests/AK/TestStdLibExtras.cpp @@ -20,11 +20,47 @@ TEST_CASE(ceil_div) EXPECT_EQ(ceil_div(3, 1), 3); EXPECT_EQ(ceil_div(4, 1), 4); + EXPECT_EQ(ceil_div(-0, 1), 0); + EXPECT_EQ(ceil_div(-1, 1), -1); + EXPECT_EQ(ceil_div(-2, 1), -2); + EXPECT_EQ(ceil_div(-3, 1), -3); + EXPECT_EQ(ceil_div(-4, 1), -4); + + EXPECT_EQ(ceil_div(0, -1), 0); + EXPECT_EQ(ceil_div(1, -1), -1); + EXPECT_EQ(ceil_div(2, -1), -2); + EXPECT_EQ(ceil_div(3, -1), -3); + EXPECT_EQ(ceil_div(4, -1), -4); + + EXPECT_EQ(ceil_div(-0, -1), 0); + EXPECT_EQ(ceil_div(-1, -1), 1); + EXPECT_EQ(ceil_div(-2, -1), 2); + EXPECT_EQ(ceil_div(-3, -1), 3); + EXPECT_EQ(ceil_div(-4, -1), 4); + EXPECT_EQ(ceil_div(0, 2), 0); EXPECT_EQ(ceil_div(1, 2), 1); EXPECT_EQ(ceil_div(2, 2), 1); EXPECT_EQ(ceil_div(3, 2), 2); EXPECT_EQ(ceil_div(4, 2), 2); + + EXPECT_EQ(ceil_div(-0, 2), 0); + EXPECT_EQ(ceil_div(-1, 2), 0); + EXPECT_EQ(ceil_div(-2, 2), -1); + EXPECT_EQ(ceil_div(-3, 2), -1); + EXPECT_EQ(ceil_div(-4, 2), -2); + + EXPECT_EQ(ceil_div(0, -2), 0); + EXPECT_EQ(ceil_div(1, -2), 0); + EXPECT_EQ(ceil_div(2, -2), -1); + EXPECT_EQ(ceil_div(3, -2), -1); + EXPECT_EQ(ceil_div(4, -2), -2); + + EXPECT_EQ(ceil_div(-0, -2), 0); + EXPECT_EQ(ceil_div(-1, -2), 1); + EXPECT_EQ(ceil_div(-2, -2), 1); + EXPECT_EQ(ceil_div(-3, -2), 2); + EXPECT_EQ(ceil_div(-4, -2), 2); } TEST_CASE(mix)