Author: celestin Date: Fri Aug 31 01:57:50 2012 New Revision: 1379253 URL: http://svn.apache.org/viewvc?rev=1379253&view=rev Log: MATH-849: unit tests for double Gamma.invGamma1pm1(double).
Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/special/GammaTest.java Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/special/GammaTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/special/GammaTest.java?rev=1379253&r1=1379252&r2=1379253&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/special/GammaTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/special/GammaTest.java Fri Aug 31 01:57:50 2012 @@ -17,6 +17,8 @@ package org.apache.commons.math3.special; import org.apache.commons.math3.TestUtils; +import org.apache.commons.math3.exception.NumberIsTooLargeException; +import org.apache.commons.math3.exception.NumberIsTooSmallException; import org.apache.commons.math3.util.FastMath; import org.junit.Test; @@ -320,6 +322,75 @@ public class GammaTest { } } + /** + * <p> + * Reference values for the {@link GammaNSWC#invGamma1pm1(double)} method. + * These values were generated with the following <a + * href="http://maxima.sourceforge.net/">Maxima</a> script + * </p> + * + * <pre> + * kill(all); + * + * fpprec : 64; + * gam1(x) := 1 / gamma(1 + x) - 1; + * x : makelist(bfloat(i / 8), i, -4, 12); + * + * for i : 1 while i <= length(x) do print("{", + * float(x[i]), + * ",", + * float(gam1(x[i])), + * "},"); + * </pre> + */ + // @formatter:off + private static final double[][] INV_GAMMA1P_M1_REF = { + { -0.5 , -.4358104164522437 }, + { -0.375 , -.3029021533379859 }, + { -0.25 , -0.183951060901737 }, + { -0.125 , -.08227611018520711 }, + { 0.0 , 0.0 }, + { 0.125 , .06186116458306091 }, + { 0.25 , .1032626513208373 }, + { 0.375 , .1249687649039041 }, + { 0.5 , .1283791670955126 }, + { 0.625 , .1153565546592225 }, + { 0.75 , 0.0880652521310173 }, + { 0.875 , .04882730264547758 }, + { 1.0 , 0.0 }, + { 1.125 , -.05612340925950141 }, + { 1.25 , -.1173898789433302 }, + { 1.375 , -.1818408982517061 }, + { 1.5 , -0.247747221936325 }, + }; + // @formatter:on + + @Test + public void testInvGamma1pm1() { + + final int ulps = 3; + for (int i = 0; i < INV_GAMMA1P_M1_REF.length; i++) { + final double[] ref = INV_GAMMA1P_M1_REF[i]; + final double x = ref[0]; + final double expected = ref[1]; + final double actual = Gamma.invGamma1pm1(x); + final double tol = ulps * FastMath.ulp(expected); + Assert.assertEquals(Double.toString(x), expected, actual, tol); + } + } + + @Test(expected = NumberIsTooSmallException.class) + public void testInvGamma1pm1Precondition1() { + + Gamma.invGamma1pm1(-0.51); + } + + @Test(expected = NumberIsTooLargeException.class) + public void testInvGamma1pm1Precondition2() { + + Gamma.invGamma1pm1(1.51); + } + private void checkRelativeError(String msg, double expected, double actual, double tolerance) { Assert.assertEquals(msg, expected, actual, FastMath.abs(tolerance * actual)); }