On 4/27/11 4:54 AM, [email protected] wrote:
> Author: erans
> Date: Wed Apr 27 11:54:16 2011
> New Revision: 1097088
>
> URL: http://svn.apache.org/viewvc?rev=1097088&view=rev
> Log:
> MATH-561
> Map a value to the interval [O, period).
>
> Modified:
>
> commons/proper/math/trunk/src/main/java/org/apache/commons/math/util/MathUtils.java
>
> commons/proper/math/trunk/src/test/java/org/apache/commons/math/util/MathUtilsTest.java
>
> Modified:
> commons/proper/math/trunk/src/main/java/org/apache/commons/math/util/MathUtils.java
> URL:
> http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/util/MathUtils.java?rev=1097088&r1=1097087&r2=1097088&view=diff
> ==============================================================================
> ---
> commons/proper/math/trunk/src/main/java/org/apache/commons/math/util/MathUtils.java
> (original)
> +++
> commons/proper/math/trunk/src/main/java/org/apache/commons/math/util/MathUtils.java
> Wed Apr 27 11:54:16 2011
> @@ -1281,6 +1281,22 @@ public final class MathUtils {
> return a - TWO_PI * FastMath.floor((a + FastMath.PI - center) /
> TWO_PI);
> }
>
> + /**
> + * Reduce to the primary interval {@code [0 period)}.
> + *
> + * @param a Value to reduce.
> + * @param period Period.
> + * @param offset Value that will be mapped to {@code 0}.
> + * @return the value, within the interval {@code [0 period)},
> + * that corresponds to {@code a}.
What about infinities / NaNs as arguments? Should we throw
IllegalArgumentException or just return NaNs / infinities?
We should also clarify in javadoc what happens when period < 0
(mapping is into (period, 0]) and make it clearer exactly what this
function computes. Probably best to just include the formula in the
javadoc.
Phil
> + */
> + public static double reduce(double a,
> + double period,
> + double offset) {
> + final double p = Math.abs(period);
> + return a - p * Math.floor((a - offset) / p) - offset;
> + }
> +
> /**
> * <p>Normalizes an array to make it sum to a specified value.
> * Returns the result of the transformation <pre>
>
> Modified:
> commons/proper/math/trunk/src/test/java/org/apache/commons/math/util/MathUtilsTest.java
> URL:
> http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/util/MathUtilsTest.java?rev=1097088&r1=1097087&r2=1097088&view=diff
> ==============================================================================
> ---
> commons/proper/math/trunk/src/test/java/org/apache/commons/math/util/MathUtilsTest.java
> (original)
> +++
> commons/proper/math/trunk/src/test/java/org/apache/commons/math/util/MathUtilsTest.java
> Wed Apr 27 11:54:16 2011
> @@ -1054,6 +1054,55 @@ public final class MathUtilsTest {
> }
>
> @Test
> + public void testReduce() {
> + final double period = -12.222;
> + final double offset = 13;
> +
> + final double delta = 1.5;
> +
> + double orig = offset + 122456789 * period + delta;
> + double expected = delta;
> + Assert.assertEquals(expected,
> + MathUtils.reduce(orig, period, offset),
> + 1e-7);
> + Assert.assertEquals(expected,
> + MathUtils.reduce(orig, -period, offset),
> + 1e-7);
> +
> + orig = offset - 123356789 * period - delta;
> + expected = Math.abs(period) - delta;
> + Assert.assertEquals(expected,
> + MathUtils.reduce(orig, period, offset),
> + 1e-6);
> + Assert.assertEquals(expected,
> + MathUtils.reduce(orig, -period, offset),
> + 1e-6);
> +
> + orig = offset - 123446789 * period + delta;
> + expected = delta;
> + Assert.assertEquals(expected,
> + MathUtils.reduce(orig, period, offset),
> + 1e-6);
> + Assert.assertEquals(expected,
> + MathUtils.reduce(orig, -period, offset),
> + 1e-6);
> + }
> +
> + @Test
> + public void testReduceComparedWithNormalizeAngle() {
> + final double tol = Math.ulp(1d);
> + final double period = 2 * Math.PI;
> + for (double a = -15; a <= 15; a += 0.5) {
> + for (double center = -15; center <= 15; center += 1) {
> + final double nA = MathUtils.normalizeAngle(a, center);
> + final double offset = center - Math.PI;
> + final double r = MathUtils.reduce(a, period, offset);
> + Assert.assertEquals(nA, r + offset, tol);
> + }
> + }
> + }
> +
> + @Test
> public void testNormalizeArray() {
> double[] testValues1 = new double[] {1, 1, 2};
> TestUtils.assertEquals(
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]