diff --git a/src/java/org/apache/commons/math/complex/ComplexMath.java b/src/java/org/apache/commons/math/complex/ComplexMath.java index 07f39bb0b..f8ca9b281 100644 --- a/src/java/org/apache/commons/math/complex/ComplexMath.java +++ b/src/java/org/apache/commons/math/complex/ComplexMath.java @@ -62,7 +62,7 @@ import org.apache.commons.math.util.MathUtils; * Reference: * http://myweb.lmu.edu/dmsmith/ZMLIB.pdf * - * @version $Revision: 1.3 $ $Date: 2003/11/14 22:22:22 $ + * @version $Revision: 1.4 $ $Date: 2003/11/15 18:52:31 $ */ public class ComplexMath { @@ -105,9 +105,10 @@ public class ComplexMath { return Complex.NaN; } + return Complex.I.multiply( log(Complex.I.add(z).divide(Complex.I.subtract(z)))) - .multiply(new Complex(2.0, 0.0)); + .divide(new Complex(2.0, 0.0)); } /** @@ -219,8 +220,8 @@ public class ComplexMath { if (a >= 0.0) { return new Complex(t, b / (2.0 * t)); } else { - double s = (b > 0.0 ? 1.0 : (b < 0.0 ? -1.0 : 0.0)); - return new Complex(Math.abs(z.getImaginary()) / (2.0 * t), s * t); + return new Complex(Math.abs(z.getImaginary()) / (2.0 * t), + MathUtils.sign(b) * t); } } @@ -244,7 +245,7 @@ public class ComplexMath { double b2 = 2.0 * z.getImaginary(); double d = Math.cos(a2) + MathUtils.cosh(b2); - return new Complex(Math.sin(a2) / d, MathUtils.sinh(b2) / 2); + return new Complex(Math.sin(a2) / d, MathUtils.sinh(b2) / d); } /** @@ -259,6 +260,6 @@ public class ComplexMath { double b2 = 2.0 * z.getImaginary(); double d = MathUtils.cosh(a2) + Math.cos(b2); - return new Complex(MathUtils.sinh(a2) / d, Math.sin(b2) / 2); + return new Complex(MathUtils.sinh(a2) / d, Math.sin(b2) / d); } } diff --git a/src/java/org/apache/commons/math/stat/StatUtils.java b/src/java/org/apache/commons/math/stat/StatUtils.java index 7eb056340..c416a08a5 100644 --- a/src/java/org/apache/commons/math/stat/StatUtils.java +++ b/src/java/org/apache/commons/math/stat/StatUtils.java @@ -58,6 +58,7 @@ import org.apache.commons.math.stat.univariate.moment.Mean; import org.apache.commons.math.stat.univariate.moment.Variance; import org.apache.commons.math.stat.univariate.rank.Max; import org.apache.commons.math.stat.univariate.rank.Min; +import org.apache.commons.math.stat.univariate.rank.Percentile; import org.apache.commons.math.stat.univariate.summary.Product; import org.apache.commons.math.stat.univariate.summary.Sum; import org.apache.commons.math.stat.univariate.summary.SumOfLogs; @@ -67,34 +68,37 @@ import org.apache.commons.math.stat.univariate.summary.SumOfSquares; * StatUtils provides easy static implementations of common double[] based * statistical methods. These return a single result value or in some cases, as * identified in the javadoc for each method, Double.NaN. - * @version $Revision: 1.21 $ $Date: 2003/11/14 22:22:18 $ + * @version $Revision: 1.22 $ $Date: 2003/11/15 18:52:31 $ */ public final class StatUtils { - /** sum */ - private static UnivariateStatistic sum = new Sum(); - - /** sumSq */ - private static UnivariateStatistic sumSq = new SumOfSquares(); - - /** prod */ - private static UnivariateStatistic prod = new Product(); - - /** sumLog */ - private static UnivariateStatistic sumLog = new SumOfLogs(); - - /** min */ - private static UnivariateStatistic min = new Min(); - - /** max */ - private static UnivariateStatistic max = new Max(); - - /** mean */ - private static UnivariateStatistic mean = new Mean(); - - /** variance */ - private static UnivariateStatistic variance = new Variance(); - + /** sum */ + private static UnivariateStatistic sum = new Sum(); + + /** sumSq */ + private static UnivariateStatistic sumSq = new SumOfSquares(); + + /** prod */ + private static UnivariateStatistic prod = new Product(); + + /** sumLog */ + private static UnivariateStatistic sumLog = new SumOfLogs(); + + /** min */ + private static UnivariateStatistic min = new Min(); + + /** max */ + private static UnivariateStatistic max = new Max(); + + /** mean */ + private static UnivariateStatistic mean = new Mean(); + + /** variance */ + private static UnivariateStatistic variance = new Variance(); + + /** variance */ + private static Percentile percentile = new Percentile(); + /** * Private Constructor */ @@ -107,7 +111,7 @@ public final class StatUtils { * @return the sum of the values or Double.NaN if the array is empty */ public static double sum(final double[] values) { - return sum.evaluate(values); + return sum.evaluate(values); } /** @@ -130,7 +134,7 @@ public final class StatUtils { * @return the sum of the squared values or Double.NaN if the array is empty */ public static double sumSq(final double[] values) { - return sumSq.evaluate(values); + return sumSq.evaluate(values); } /** @@ -176,7 +180,7 @@ public final class StatUtils { * @return the sumLog value or Double.NaN if the array is empty */ public static double sumLog(final double[] values) { - return sumLog.evaluate(values); + return sumLog.evaluate(values); } /** @@ -190,7 +194,7 @@ public final class StatUtils { final double[] values, final int begin, final int length) { - return sumLog.evaluate(values, begin, length); + return sumLog.evaluate(values, begin, length); } /** @@ -200,7 +204,7 @@ public final class StatUtils { * @return the mean of the values or Double.NaN if the array is empty */ public static double mean(final double[] values) { - return mean.evaluate(values); + return mean.evaluate(values); } /** @@ -232,7 +236,7 @@ public final class StatUtils { * or 0.0 for a single value set. */ public static double variance(final double[] values) { - return variance.evaluate(values); + return variance.evaluate(values); } /** @@ -263,7 +267,7 @@ public final class StatUtils { * @return the maximum of the values or Double.NaN if the array is empty */ public static double max(final double[] values) { - return max.evaluate(values); + return max.evaluate(values); } /** @@ -286,7 +290,7 @@ public final class StatUtils { * @return the minimum of the values or Double.NaN if the array is empty */ public static double min(final double[] values) { - return min.evaluate(values); + return min.evaluate(values); } /** @@ -302,5 +306,52 @@ public final class StatUtils { final int length) { return min.evaluate(values, begin, length); } + + /** + * Returns an estimate for the pth percentile of the stored values. + * This estimate follows the interpolation-adjusted defintion presented + * here + *

+ * Preconditions:

+ * + * @param values Is a double[] containing the values + * @param p the requested percentile (scaled from 0 - 100) + * @return An estimate for the pth percentile of the data values + */ + public static double percentile(final double[] values, final double p) { + return percentile.evaluate(values,p); + } + + /** + * Returns an estimate for the pth percentile of the stored values. + * This estimate follows the interpolation-adjusted defintion presented + * here + *

+ * Preconditions:

+ * + * @param values Is a double[] containing the values + * @param begin processing at this point in the array + * @param length processing at this point in the array + * @param p the requested percentile (scaled from 0 - 100) + * @return An estimate for the pth percentile of the data values + */ + public static double percentile( + final double[] values, + final int begin, + final int length, + final double p) { + return percentile.evaluate(values, begin, length, p); + } + } \ No newline at end of file diff --git a/src/test/org/apache/commons/math/TestUtils.java b/src/test/org/apache/commons/math/TestUtils.java index 04bf95396..34644ba02 100644 --- a/src/test/org/apache/commons/math/TestUtils.java +++ b/src/test/org/apache/commons/math/TestUtils.java @@ -54,10 +54,12 @@ package org.apache.commons.math; +import org.apache.commons.math.complex.Complex; + import junit.framework.Assert; /** - * @version $Revision: 1.6 $ $Date: 2003/11/14 22:22:23 $ + * @version $Revision: 1.7 $ $Date: 2003/11/15 18:52:31 $ */ public class TestUtils { /** @@ -75,4 +77,12 @@ public class TestUtils { Assert.assertEquals(expected, actual, delta); } } + + /** + * + */ + public static void assertEquals(Complex expected, Complex actual, double delta) { + assertEquals(expected.getReal(), actual.getReal(), delta); + assertEquals(expected.getImaginary(), actual.getImaginary(), delta); + } } diff --git a/src/test/org/apache/commons/math/complex/ComplexMathTest.java b/src/test/org/apache/commons/math/complex/ComplexMathTest.java new file mode 100644 index 000000000..fd09647b8 --- /dev/null +++ b/src/test/org/apache/commons/math/complex/ComplexMathTest.java @@ -0,0 +1,236 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2003 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowledgement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgement may appear in the software itself, + * if and wherever such third-party acknowledgements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their name without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.commons.math.complex; + +import org.apache.commons.math.TestUtils; + +import junit.framework.TestCase; + +/** + * @version $Revision: 1.1 $ $Date: 2003/11/15 18:52:31 $ + */ +public class ComplexMathTest extends TestCase { + + public void testAcos() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(0.936812, -2.30551); + TestUtils.assertEquals(expected, ComplexMath.acos(z), 1.0e-5); + } + + public void testAcosNaN() { + assertTrue(ComplexMath.acos(Complex.NaN).isNaN()); + } + + public void testAsin() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(0.633984, 2.30551); + TestUtils.assertEquals(expected, ComplexMath.asin(z), 1.0e-5); + } + + public void testAsinNaN() { + assertTrue(ComplexMath.asin(Complex.NaN).isNaN()); + } + + public void testAtan() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(1.44831, 0.158997); + TestUtils.assertEquals(expected, ComplexMath.atan(z), 1.0e-5); + } + + public void testAtanNaN() { + assertTrue(ComplexMath.atan(Complex.NaN).isNaN()); + } + + public void testCos() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(-27.03495, -3.851153); + TestUtils.assertEquals(expected, ComplexMath.cos(z), 1.0e-5); + } + + public void testCosh() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(-6.58066, -7.58155); + TestUtils.assertEquals(expected, ComplexMath.cosh(z), 1.0e-5); + } + + public void testCoshNaN() { + assertTrue(ComplexMath.cosh(Complex.NaN).isNaN()); + } + + public void testCosNaN() { + assertTrue(ComplexMath.cos(Complex.NaN).isNaN()); + } + + public void testExp() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(-13.12878, -15.20078); + TestUtils.assertEquals(expected, ComplexMath.exp(z), 1.0e-5); + } + + public void testExpNaN() { + assertTrue(ComplexMath.exp(Complex.NaN).isNaN()); + } + + public void testLog() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(1.60944, 0.927295); + TestUtils.assertEquals(expected, ComplexMath.log(z), 1.0e-5); + } + + public void testLogNaN() { + assertTrue(ComplexMath.log(Complex.NaN).isNaN()); + } + + public void testPow() { + Complex x = new Complex(3, 4); + Complex y = new Complex(5, 6); + Complex expected = new Complex(-1.860893, 11.83677); + TestUtils.assertEquals(expected, ComplexMath.pow(x, y), 1.0e-5); + } + + public void testPowNaNBase() { + Complex x = new Complex(3, 4); + assertTrue(ComplexMath.pow(Complex.NaN, x).isNaN()); + } + + public void testPowNaNExponent() { + Complex x = new Complex(3, 4); + assertTrue(ComplexMath.pow(x, Complex.NaN).isNaN()); + } + + public void testSin() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(3.853738, -27.01681); + TestUtils.assertEquals(expected, ComplexMath.sin(z), 1.0e-5); + } + + public void testSinh() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(-6.54812, -7.61923); + TestUtils.assertEquals(expected, ComplexMath.sinh(z), 1.0e-5); + } + + public void testSinhNaN() { + assertTrue(ComplexMath.sinh(Complex.NaN).isNaN()); + } + + public void testSinNaN() { + assertTrue(ComplexMath.sin(Complex.NaN).isNaN()); + } + + public void testSqrtRealPositive() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(2, 1); + TestUtils.assertEquals(expected, ComplexMath.sqrt(z), 1.0e-5); + } + + public void testSqrtRealZero() { + Complex z = new Complex(0.0, 4); + Complex expected = new Complex(1.41421, 1.41421); + TestUtils.assertEquals(expected, ComplexMath.sqrt(z), 1.0e-5); + } + + public void testSqrtRealNegative() { + Complex z = new Complex(-3.0, 4); + Complex expected = new Complex(1, 2); + TestUtils.assertEquals(expected, ComplexMath.sqrt(z), 1.0e-5); + } + + public void testSqrtImaginaryZero() { + Complex z = new Complex(-3.0, 0.0); + Complex expected = new Complex(0.0, 1.73205); + TestUtils.assertEquals(expected, ComplexMath.sqrt(z), 1.0e-5); + } + + public void testSqrtImaginaryNegative() { + Complex z = new Complex(-3.0, -4.0); + Complex expected = new Complex(1.0, -2.0); + TestUtils.assertEquals(expected, ComplexMath.sqrt(z), 1.0e-5); + } + + public void testSqrt1z() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(4.08033, -2.94094); + TestUtils.assertEquals(expected, ComplexMath.sqrt1z(z), 1.0e-5); + } + + public void testSqrt1zNaN() { + assertTrue(ComplexMath.sqrt1z(Complex.NaN).isNaN()); + } + + public void testSqrtNaN() { + assertTrue(ComplexMath.sqrt(Complex.NaN).isNaN()); + } + + public void testTan() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(-0.000187346, 0.999356); + TestUtils.assertEquals(expected, ComplexMath.tan(z), 1.0e-5); + } + + public void testTanh() { + Complex z = new Complex(3, 4); + Complex expected = new Complex(1.00071, 0.00490826); + TestUtils.assertEquals(expected, ComplexMath.tanh(z), 1.0e-5); + } + + public void testTanhNaN() { + assertTrue(ComplexMath.tanh(Complex.NaN).isNaN()); + } + + public void testTanNaN() { + assertTrue(ComplexMath.tan(Complex.NaN).isNaN()); + } +} diff --git a/src/test/org/apache/commons/math/complex/ComplexTest.java b/src/test/org/apache/commons/math/complex/ComplexTest.java index 43091f118..d4ed28e3a 100644 --- a/src/test/org/apache/commons/math/complex/ComplexTest.java +++ b/src/test/org/apache/commons/math/complex/ComplexTest.java @@ -59,7 +59,7 @@ package org.apache.commons.math.complex; import junit.framework.TestCase; /** - * @version $Revision: 1.3 $ $Date: 2003/11/14 22:22:24 $ + * @version $Revision: 1.4 $ $Date: 2003/11/15 18:52:31 $ */ public class ComplexTest extends TestCase { @@ -85,6 +85,10 @@ public class ComplexTest extends TestCase { assertEquals(5.0, z.abs(), 1.0e-5); } + public void testAbsNaN() { + assertTrue(Double.isNaN(Complex.NaN.abs())); + } + public void testAdd() { Complex x = new Complex(3.0, 4.0); Complex y = new Complex(5.0, 6.0); @@ -164,4 +168,37 @@ public class ComplexTest extends TestCase { Complex z = x.subtract(Complex.NaN); assertTrue(z.isNaN()); } + + public void testEqualsNull() { + Complex x = new Complex(3.0, 4.0); + assertFalse(x.equals(null)); + } + + public void testEqualsClass() { + Complex x = new Complex(3.0, 4.0); + assertFalse(x.equals(this)); + } + + public void testEqualsSame() { + Complex x = new Complex(3.0, 4.0); + assertTrue(x.equals(x)); + } + + public void testEqualsTrue() { + Complex x = new Complex(3.0, 4.0); + Complex y = new Complex(3.0, 4.0); + assertTrue(x.equals(y)); + } + + public void testEqualsRealDifference() { + Complex x = new Complex(0.0, 0.0); + Complex y = new Complex(0.0 + Double.MIN_VALUE, 0.0); + assertFalse(x.equals(y)); + } + + public void testEqualsImaginaryDifference() { + Complex x = new Complex(0.0, 0.0); + Complex y = new Complex(0.0, 0.0 + Double.MIN_VALUE); + assertFalse(x.equals(y)); + } } diff --git a/src/test/org/apache/commons/math/util/MathUtilsTest.java b/src/test/org/apache/commons/math/util/MathUtilsTest.java index b6c624abd..7f65e8bb0 100644 --- a/src/test/org/apache/commons/math/util/MathUtilsTest.java +++ b/src/test/org/apache/commons/math/util/MathUtilsTest.java @@ -53,6 +53,8 @@ */ package org.apache.commons.math.util; +import org.apache.commons.math.TestUtils; + import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -60,7 +62,7 @@ import junit.framework.TestSuite; /** * Test cases for the MathUtils class. * - * @version $Revision: 1.6 $ $Date: 2003/11/14 22:22:23 $ + * @version $Revision: 1.7 $ $Date: 2003/11/15 18:52:31 $ */ public final class MathUtilsTest extends TestCase { @@ -349,4 +351,24 @@ public final class MathUtilsTest extends TestCase { assertEquals( 1L, MathUtils.sign( 2L ) ) ; assertEquals( -1L, MathUtils.sign( -2L ) ) ; } + + public void testCosh() { + double x = 3.0; + double expected = 10.06766; + assertEquals(expected, MathUtils.cosh(x), 1.0e-5); + } + + public void testSinh() { + double x = 3.0; + double expected = 10.01787; + assertEquals(expected, MathUtils.sinh(x), 1.0e-5); + } + + public void testCoshNaN() { + assertTrue(Double.isNaN(MathUtils.cosh(Double.NaN))); + } + + public void testSinhNaN() { + assertTrue(Double.isNaN(MathUtils.sinh(Double.NaN))); + } } \ No newline at end of file