diff --git a/src/main/java/pythagoras/i/MathUtil.java b/src/main/java/pythagoras/i/MathUtil.java index c5770d6..e156816 100644 --- a/src/main/java/pythagoras/i/MathUtil.java +++ b/src/main/java/pythagoras/i/MathUtil.java @@ -17,4 +17,20 @@ public class MathUtil if (value > high) return high; return value; } + + /** + * Computes the floored division {@code dividend/divisor} which is useful when dividing + * potentially negative numbers into bins. + * + *
For example, the following numbers {@code floorDiv} 10 are: + *
+ * -15 -10 -8 -2 0 2 8 10 15 + * -2 -1 -1 -1 0 0 0 1 1 + *+ */ + public static int floorDiv (int dividend, int divisor) { + boolean numpos = dividend >= 0, denpos = divisor >= 0; + if (numpos == denpos) return dividend / divisor; + return denpos ? (dividend - divisor + 1) / divisor : (dividend - divisor - 1) / divisor; + } } diff --git a/src/test/java/pythagoras/i/MathUtilTest.java b/src/test/java/pythagoras/i/MathUtilTest.java new file mode 100644 index 0000000..66c823d --- /dev/null +++ b/src/test/java/pythagoras/i/MathUtilTest.java @@ -0,0 +1,22 @@ +// +// Pythagoras - a collection of geometry classes +// http://github.com/samskivert/pythagoras + +package pythagoras.i; + +import org.junit.*; +import static org.junit.Assert.*; + +/** + * Tests parts of the {@link MathUtil} class. + */ +public class MathUtilTest +{ + @Test public void testFloorDiv () { + int[] nums = { -15, -10, -8, -2, 0, 2, 8, 10, 15 }; + int[] vals = { -2, -1, -1, -1, 0, 0, 0, 1, 1 }; + for (int ii = 0; ii < nums.length; ii++) { + assertEquals(vals[ii], MathUtil.floorDiv(nums[ii], 10)); + } + } +}