From f905314deccdd5aab87b8d665d65f36bff4e0f47 Mon Sep 17 00:00:00 2001 From: alxkm Date: Thu, 10 Jul 2025 23:04:32 +0200 Subject: [PATCH 1/5] refactor: refactor Ceil and improved tests --- .../java/com/thealgorithms/maths/Ceil.java | 22 +++++++++++-------- .../com/thealgorithms/maths/CeilTest.java | 15 ++++++------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/Ceil.java b/src/main/java/com/thealgorithms/maths/Ceil.java index aacb9d969950..4600f59b3d0d 100644 --- a/src/main/java/com/thealgorithms/maths/Ceil.java +++ b/src/main/java/com/thealgorithms/maths/Ceil.java @@ -1,23 +1,27 @@ package com.thealgorithms.maths; +/** + * Utility class to compute the ceiling of a given number. + */ public final class Ceil { + private Ceil() { } /** - * Returns the smallest (closest to negative infinity) + * Returns the smallest double value that is greater than or equal to the input. + * Equivalent to mathematical ⌈x⌉ (ceiling function). * - * @param number the number - * @return the smallest (closest to negative infinity) of given - * {@code number} + * @param number the number to ceil + * @return the smallest double greater than or equal to {@code number} */ public static double ceil(double number) { - if (number - (int) number == 0) { - return number; - } else if (number - (int) number > 0) { - return (int) (number + 1); + long intPart = (long) number; + + if (number > 0 && number != intPart) { + return intPart + 1.0; } else { - return (int) number; + return (double) intPart; } } } diff --git a/src/test/java/com/thealgorithms/maths/CeilTest.java b/src/test/java/com/thealgorithms/maths/CeilTest.java index 5596760a8c40..6b42852ff9c5 100644 --- a/src/test/java/com/thealgorithms/maths/CeilTest.java +++ b/src/test/java/com/thealgorithms/maths/CeilTest.java @@ -2,16 +2,15 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Test; +import com.thealgorithms.maths.Ceil; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; public class CeilTest { - @Test - void testCeil() { - assertEquals(8, Ceil.ceil(7.057)); - assertEquals(8, Ceil.ceil(7.004)); - assertEquals(-13, Ceil.ceil(-13.004)); - assertEquals(1, Ceil.ceil(.98)); - assertEquals(-11, Ceil.ceil(-11.357)); + @ParameterizedTest + @CsvSource({"7.057, 8", "7.004, 8", "-13.004, -13", "0.98, 1", "-11.357, -11"}) + void testCeil(double input, int expected) { + assertEquals(expected, Ceil.ceil(input)); } } From 2b6f328d1c251c9ca4e3b3fa48425450759d2075 Mon Sep 17 00:00:00 2001 From: alxkm Date: Thu, 10 Jul 2025 23:12:37 +0200 Subject: [PATCH 2/5] checkstyle: remove redundant import --- src/test/java/com/thealgorithms/maths/CeilTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/maths/CeilTest.java b/src/test/java/com/thealgorithms/maths/CeilTest.java index 6b42852ff9c5..df4b3c8ed0dc 100644 --- a/src/test/java/com/thealgorithms/maths/CeilTest.java +++ b/src/test/java/com/thealgorithms/maths/CeilTest.java @@ -2,7 +2,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import com.thealgorithms.maths.Ceil; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; From 59e980a2db22876babb79d7c68e55b3eeea58646 Mon Sep 17 00:00:00 2001 From: alxkm Date: Sun, 13 Jul 2025 13:03:53 +0200 Subject: [PATCH 3/5] refactor: fix edge cases --- src/main/java/com/thealgorithms/maths/Ceil.java | 11 +++++++++-- .../java/com/thealgorithms/maths/CeilTest.java | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/Ceil.java b/src/main/java/com/thealgorithms/maths/Ceil.java index 4600f59b3d0d..28804eb1c569 100644 --- a/src/main/java/com/thealgorithms/maths/Ceil.java +++ b/src/main/java/com/thealgorithms/maths/Ceil.java @@ -16,12 +16,19 @@ private Ceil() { * @return the smallest double greater than or equal to {@code number} */ public static double ceil(double number) { - long intPart = (long) number; + if (Double.isNaN(number) || Double.isInfinite(number) || number == 0.0 || number < Integer.MIN_VALUE || number > Integer.MAX_VALUE) { + return number; + } + if (number < 0.0 && number > -1.0) { + return -0.0; + } + + long intPart = (long) number; if (number > 0 && number != intPart) { return intPart + 1.0; } else { - return (double) intPart; + return intPart; } } } diff --git a/src/test/java/com/thealgorithms/maths/CeilTest.java b/src/test/java/com/thealgorithms/maths/CeilTest.java index df4b3c8ed0dc..1a690771024b 100644 --- a/src/test/java/com/thealgorithms/maths/CeilTest.java +++ b/src/test/java/com/thealgorithms/maths/CeilTest.java @@ -4,6 +4,9 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; public class CeilTest { @@ -12,4 +15,16 @@ public class CeilTest { void testCeil(double input, int expected) { assertEquals(expected, Ceil.ceil(input)); } + + @ParameterizedTest + @MethodSource("edgeCaseProvider") + void testEdgeCases(TestData data) { + assertEquals(Ceil.ceil(data.input), data.expected); + } + + record TestData(double input, double expected) {} + + static Stream edgeCaseProvider() { + return Stream.of(new TestData(Double.MAX_VALUE, Double.MAX_VALUE), new TestData(Double.MIN_VALUE, Math.ceil(Double.MIN_VALUE)), new TestData(0.0, Math.ceil(0.0)), new TestData(-0.0, Math.ceil(-0.0)), new TestData(Double.NaN, Math.ceil(Double.NaN)), new TestData(Double.NEGATIVE_INFINITY, Math.ceil(Double.NEGATIVE_INFINITY)), new TestData(Double.POSITIVE_INFINITY, Math.ceil(Double.POSITIVE_INFINITY))); + } } From e650207dbf28080080c20fd75a7f2e9b68bc9f51 Mon Sep 17 00:00:00 2001 From: alxkm Date: Sun, 13 Jul 2025 13:08:36 +0200 Subject: [PATCH 4/5] refactor: fix checkstyle --- src/test/java/com/thealgorithms/maths/CeilTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/thealgorithms/maths/CeilTest.java b/src/test/java/com/thealgorithms/maths/CeilTest.java index 1a690771024b..51ce423c4097 100644 --- a/src/test/java/com/thealgorithms/maths/CeilTest.java +++ b/src/test/java/com/thealgorithms/maths/CeilTest.java @@ -22,9 +22,11 @@ void testEdgeCases(TestData data) { assertEquals(Ceil.ceil(data.input), data.expected); } - record TestData(double input, double expected) {} + record TestData(double input, double expected) { + } static Stream edgeCaseProvider() { - return Stream.of(new TestData(Double.MAX_VALUE, Double.MAX_VALUE), new TestData(Double.MIN_VALUE, Math.ceil(Double.MIN_VALUE)), new TestData(0.0, Math.ceil(0.0)), new TestData(-0.0, Math.ceil(-0.0)), new TestData(Double.NaN, Math.ceil(Double.NaN)), new TestData(Double.NEGATIVE_INFINITY, Math.ceil(Double.NEGATIVE_INFINITY)), new TestData(Double.POSITIVE_INFINITY, Math.ceil(Double.POSITIVE_INFINITY))); + return Stream.of(new TestData(Double.MAX_VALUE, Double.MAX_VALUE), new TestData(Double.MIN_VALUE, Math.ceil(Double.MIN_VALUE)), new TestData(0.0, Math.ceil(0.0)), new TestData(-0.0, Math.ceil(-0.0)), new TestData(Double.NaN, Math.ceil(Double.NaN)), + new TestData(Double.NEGATIVE_INFINITY, Math.ceil(Double.NEGATIVE_INFINITY)), new TestData(Double.POSITIVE_INFINITY, Math.ceil(Double.POSITIVE_INFINITY))); } } From a773cfc8e389966f8da1efd8e66f88062b14b252 Mon Sep 17 00:00:00 2001 From: alxkm Date: Sun, 13 Jul 2025 13:10:09 +0200 Subject: [PATCH 5/5] refactor: fix checkstyle import order --- src/test/java/com/thealgorithms/maths/CeilTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/com/thealgorithms/maths/CeilTest.java b/src/test/java/com/thealgorithms/maths/CeilTest.java index 51ce423c4097..ddd0deed41d3 100644 --- a/src/test/java/com/thealgorithms/maths/CeilTest.java +++ b/src/test/java/com/thealgorithms/maths/CeilTest.java @@ -2,12 +2,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.stream.Stream; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; -import java.util.stream.Stream; - public class CeilTest { @ParameterizedTest