Created ArithmeticsUtilsTest. Moved some tests from MathUtilsTest to ArithmeticsUtilsTest (MATH-689).
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1182215 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6cb2b3c612
commit
d8866aedf4
|
@ -0,0 +1,315 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.commons.math.util;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import org.apache.commons.math.exception.MathArithmeticException;
|
||||||
|
import org.apache.commons.math.exception.MathIllegalArgumentException;
|
||||||
|
import org.apache.commons.math.random.RandomDataImpl;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test cases for the {@link ArithmeticsUtils} class.
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class ArithmeticsUtilsTest {
|
||||||
|
/**
|
||||||
|
* Exact direct multiplication implementation to test against
|
||||||
|
*/
|
||||||
|
private long factorial(int n) {
|
||||||
|
long result = 1;
|
||||||
|
for (int i = 2; i <= n; i++) {
|
||||||
|
result *= i;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddAndCheck() {
|
||||||
|
int big = Integer.MAX_VALUE;
|
||||||
|
int bigNeg = Integer.MIN_VALUE;
|
||||||
|
Assert.assertEquals(big, ArithmeticsUtils.addAndCheck(big, 0));
|
||||||
|
try {
|
||||||
|
ArithmeticsUtils.addAndCheck(big, 1);
|
||||||
|
Assert.fail("Expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException ex) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ArithmeticsUtils.addAndCheck(bigNeg, -1);
|
||||||
|
Assert.fail("Expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException ex) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddAndCheckLong() {
|
||||||
|
long max = Long.MAX_VALUE;
|
||||||
|
long min = Long.MIN_VALUE;
|
||||||
|
Assert.assertEquals(max, ArithmeticsUtils.addAndCheck(max, 0L));
|
||||||
|
Assert.assertEquals(min, ArithmeticsUtils.addAndCheck(min, 0L));
|
||||||
|
Assert.assertEquals(max, ArithmeticsUtils.addAndCheck(0L, max));
|
||||||
|
Assert.assertEquals(min, ArithmeticsUtils.addAndCheck(0L, min));
|
||||||
|
Assert.assertEquals(1, ArithmeticsUtils.addAndCheck(-1L, 2L));
|
||||||
|
Assert.assertEquals(1, ArithmeticsUtils.addAndCheck(2L, -1L));
|
||||||
|
Assert.assertEquals(-3, ArithmeticsUtils.addAndCheck(-2L, -1L));
|
||||||
|
Assert.assertEquals(min, ArithmeticsUtils.addAndCheck(min + 1, -1L));
|
||||||
|
testAddAndCheckLongFailure(max, 1L);
|
||||||
|
testAddAndCheckLongFailure(min, -1L);
|
||||||
|
testAddAndCheckLongFailure(1L, max);
|
||||||
|
testAddAndCheckLongFailure(-1L, min);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testAddAndCheckLongFailure(long a, long b) {
|
||||||
|
try {
|
||||||
|
ArithmeticsUtils.addAndCheck(a, b);
|
||||||
|
Assert.fail("Expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException ex) {
|
||||||
|
// success
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSubAndCheck() {
|
||||||
|
int big = Integer.MAX_VALUE;
|
||||||
|
int bigNeg = Integer.MIN_VALUE;
|
||||||
|
Assert.assertEquals(big, ArithmeticsUtils.subAndCheck(big, 0));
|
||||||
|
Assert.assertEquals(bigNeg + 1, ArithmeticsUtils.subAndCheck(bigNeg, -1));
|
||||||
|
Assert.assertEquals(-1, ArithmeticsUtils.subAndCheck(bigNeg, -big));
|
||||||
|
try {
|
||||||
|
ArithmeticsUtils.subAndCheck(big, -1);
|
||||||
|
Assert.fail("Expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException ex) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ArithmeticsUtils.subAndCheck(bigNeg, 1);
|
||||||
|
Assert.fail("Expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException ex) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSubAndCheckErrorMessage() {
|
||||||
|
int big = Integer.MAX_VALUE;
|
||||||
|
try {
|
||||||
|
ArithmeticsUtils.subAndCheck(big, -1);
|
||||||
|
Assert.fail("Expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException ex) {
|
||||||
|
Assert.assertTrue(ex.getMessage().length() > 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSubAndCheckLong() {
|
||||||
|
long max = Long.MAX_VALUE;
|
||||||
|
long min = Long.MIN_VALUE;
|
||||||
|
Assert.assertEquals(max, ArithmeticsUtils.subAndCheck(max, 0));
|
||||||
|
Assert.assertEquals(min, ArithmeticsUtils.subAndCheck(min, 0));
|
||||||
|
Assert.assertEquals(-max, ArithmeticsUtils.subAndCheck(0, max));
|
||||||
|
Assert.assertEquals(min + 1, ArithmeticsUtils.subAndCheck(min, -1));
|
||||||
|
// min == -1-max
|
||||||
|
Assert.assertEquals(-1, ArithmeticsUtils.subAndCheck(-max - 1, -max));
|
||||||
|
Assert.assertEquals(max, ArithmeticsUtils.subAndCheck(-1, -1 - max));
|
||||||
|
testSubAndCheckLongFailure(0L, min);
|
||||||
|
testSubAndCheckLongFailure(max, -1L);
|
||||||
|
testSubAndCheckLongFailure(min, 1L);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testSubAndCheckLongFailure(long a, long b) {
|
||||||
|
try {
|
||||||
|
ArithmeticsUtils.subAndCheck(a, b);
|
||||||
|
Assert.fail("Expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException ex) {
|
||||||
|
// success
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFactorial() {
|
||||||
|
for (int i = 1; i < 21; i++) {
|
||||||
|
Assert.assertEquals(i + "! ", factorial(i), ArithmeticsUtils.factorial(i));
|
||||||
|
Assert.assertEquals(i + "! ", factorial(i), ArithmeticsUtils.factorialDouble(i), Double.MIN_VALUE);
|
||||||
|
Assert.assertEquals(i + "! ", FastMath.log(factorial(i)), ArithmeticsUtils.factorialLog(i), 10E-12);
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.assertEquals("0", 1, ArithmeticsUtils.factorial(0));
|
||||||
|
Assert.assertEquals("0", 1.0d, ArithmeticsUtils.factorialDouble(0), 1E-14);
|
||||||
|
Assert.assertEquals("0", 0.0d, ArithmeticsUtils.factorialLog(0), 1E-14);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFactorialFail() {
|
||||||
|
try {
|
||||||
|
ArithmeticsUtils.factorial(-1);
|
||||||
|
Assert.fail("expecting MathIllegalArgumentException");
|
||||||
|
} catch (MathIllegalArgumentException ex) {
|
||||||
|
// ignored
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ArithmeticsUtils.factorialDouble(-1);
|
||||||
|
Assert.fail("expecting MathIllegalArgumentException");
|
||||||
|
} catch (MathIllegalArgumentException ex) {
|
||||||
|
// ignored
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ArithmeticsUtils.factorialLog(-1);
|
||||||
|
Assert.fail("expecting MathIllegalArgumentException");
|
||||||
|
} catch (MathIllegalArgumentException ex) {
|
||||||
|
// ignored
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ArithmeticsUtils.factorial(21);
|
||||||
|
Assert.fail("expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException ex) {
|
||||||
|
// ignored
|
||||||
|
}
|
||||||
|
Assert.assertTrue("expecting infinite factorial value", Double.isInfinite(ArithmeticsUtils.factorialDouble(171)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGcd() {
|
||||||
|
int a = 30;
|
||||||
|
int b = 50;
|
||||||
|
int c = 77;
|
||||||
|
|
||||||
|
Assert.assertEquals(0, ArithmeticsUtils.gcd(0, 0));
|
||||||
|
|
||||||
|
Assert.assertEquals(b, ArithmeticsUtils.gcd(0, b));
|
||||||
|
Assert.assertEquals(a, ArithmeticsUtils.gcd(a, 0));
|
||||||
|
Assert.assertEquals(b, ArithmeticsUtils.gcd(0, -b));
|
||||||
|
Assert.assertEquals(a, ArithmeticsUtils.gcd(-a, 0));
|
||||||
|
|
||||||
|
Assert.assertEquals(10, ArithmeticsUtils.gcd(a, b));
|
||||||
|
Assert.assertEquals(10, ArithmeticsUtils.gcd(-a, b));
|
||||||
|
Assert.assertEquals(10, ArithmeticsUtils.gcd(a, -b));
|
||||||
|
Assert.assertEquals(10, ArithmeticsUtils.gcd(-a, -b));
|
||||||
|
|
||||||
|
Assert.assertEquals(1, ArithmeticsUtils.gcd(a, c));
|
||||||
|
Assert.assertEquals(1, ArithmeticsUtils.gcd(-a, c));
|
||||||
|
Assert.assertEquals(1, ArithmeticsUtils.gcd(a, -c));
|
||||||
|
Assert.assertEquals(1, ArithmeticsUtils.gcd(-a, -c));
|
||||||
|
|
||||||
|
Assert.assertEquals(3 * (1<<15), ArithmeticsUtils.gcd(3 * (1<<20), 9 * (1<<15)));
|
||||||
|
|
||||||
|
Assert.assertEquals(Integer.MAX_VALUE, ArithmeticsUtils.gcd(Integer.MAX_VALUE, 0));
|
||||||
|
Assert.assertEquals(Integer.MAX_VALUE, ArithmeticsUtils.gcd(-Integer.MAX_VALUE, 0));
|
||||||
|
Assert.assertEquals(1<<30, ArithmeticsUtils.gcd(1<<30, -Integer.MIN_VALUE));
|
||||||
|
try {
|
||||||
|
// gcd(Integer.MIN_VALUE, 0) > Integer.MAX_VALUE
|
||||||
|
ArithmeticsUtils.gcd(Integer.MIN_VALUE, 0);
|
||||||
|
Assert.fail("expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException expected) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// gcd(0, Integer.MIN_VALUE) > Integer.MAX_VALUE
|
||||||
|
ArithmeticsUtils.gcd(0, Integer.MIN_VALUE);
|
||||||
|
Assert.fail("expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException expected) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// gcd(Integer.MIN_VALUE, Integer.MIN_VALUE) > Integer.MAX_VALUE
|
||||||
|
ArithmeticsUtils.gcd(Integer.MIN_VALUE, Integer.MIN_VALUE);
|
||||||
|
Assert.fail("expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException expected) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGcdLong(){
|
||||||
|
long a = 30;
|
||||||
|
long b = 50;
|
||||||
|
long c = 77;
|
||||||
|
|
||||||
|
Assert.assertEquals(0, ArithmeticsUtils.gcd(0L, 0));
|
||||||
|
|
||||||
|
Assert.assertEquals(b, ArithmeticsUtils.gcd(0, b));
|
||||||
|
Assert.assertEquals(a, ArithmeticsUtils.gcd(a, 0));
|
||||||
|
Assert.assertEquals(b, ArithmeticsUtils.gcd(0, -b));
|
||||||
|
Assert.assertEquals(a, ArithmeticsUtils.gcd(-a, 0));
|
||||||
|
|
||||||
|
Assert.assertEquals(10, ArithmeticsUtils.gcd(a, b));
|
||||||
|
Assert.assertEquals(10, ArithmeticsUtils.gcd(-a, b));
|
||||||
|
Assert.assertEquals(10, ArithmeticsUtils.gcd(a, -b));
|
||||||
|
Assert.assertEquals(10, ArithmeticsUtils.gcd(-a, -b));
|
||||||
|
|
||||||
|
Assert.assertEquals(1, ArithmeticsUtils.gcd(a, c));
|
||||||
|
Assert.assertEquals(1, ArithmeticsUtils.gcd(-a, c));
|
||||||
|
Assert.assertEquals(1, ArithmeticsUtils.gcd(a, -c));
|
||||||
|
Assert.assertEquals(1, ArithmeticsUtils.gcd(-a, -c));
|
||||||
|
|
||||||
|
Assert.assertEquals(3L * (1L<<45), ArithmeticsUtils.gcd(3L * (1L<<50), 9L * (1L<<45)));
|
||||||
|
|
||||||
|
Assert.assertEquals(1L<<45, ArithmeticsUtils.gcd(1L<<45, Long.MIN_VALUE));
|
||||||
|
|
||||||
|
Assert.assertEquals(Long.MAX_VALUE, ArithmeticsUtils.gcd(Long.MAX_VALUE, 0L));
|
||||||
|
Assert.assertEquals(Long.MAX_VALUE, ArithmeticsUtils.gcd(-Long.MAX_VALUE, 0L));
|
||||||
|
Assert.assertEquals(1, ArithmeticsUtils.gcd(60247241209L, 153092023L));
|
||||||
|
try {
|
||||||
|
// gcd(Long.MIN_VALUE, 0) > Long.MAX_VALUE
|
||||||
|
ArithmeticsUtils.gcd(Long.MIN_VALUE, 0);
|
||||||
|
Assert.fail("expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException expected) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// gcd(0, Long.MIN_VALUE) > Long.MAX_VALUE
|
||||||
|
ArithmeticsUtils.gcd(0, Long.MIN_VALUE);
|
||||||
|
Assert.fail("expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException expected) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// gcd(Long.MIN_VALUE, Long.MIN_VALUE) > Long.MAX_VALUE
|
||||||
|
ArithmeticsUtils.gcd(Long.MIN_VALUE, Long.MIN_VALUE);
|
||||||
|
Assert.fail("expecting MathArithmeticException");
|
||||||
|
} catch (MathArithmeticException expected) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGcdConsistency() {
|
||||||
|
int[] primeList = {19, 23, 53, 67, 73, 79, 101, 103, 111, 131};
|
||||||
|
ArrayList<Integer> primes = new ArrayList<Integer>();
|
||||||
|
for (int i = 0; i < primeList.length; i++) {
|
||||||
|
primes.add(Integer.valueOf(primeList[i]));
|
||||||
|
}
|
||||||
|
RandomDataImpl randomData = new RandomDataImpl();
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
Object[] sample = randomData.nextSample(primes, 4);
|
||||||
|
int p1 = ((Integer) sample[0]).intValue();
|
||||||
|
int p2 = ((Integer) sample[1]).intValue();
|
||||||
|
int p3 = ((Integer) sample[2]).intValue();
|
||||||
|
int p4 = ((Integer) sample[3]).intValue();
|
||||||
|
int i1 = p1 * p2 * p3;
|
||||||
|
int i2 = p1 * p2 * p4;
|
||||||
|
int gcd = p1 * p2;
|
||||||
|
Assert.assertEquals(gcd, ArithmeticsUtils.gcd(i1, i2));
|
||||||
|
long l1 = i1;
|
||||||
|
long l2 = i2;
|
||||||
|
Assert.assertEquals(gcd, ArithmeticsUtils.gcd(l1, l2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -65,7 +65,7 @@ public final class MathUtilsTest {
|
||||||
if (k > 100) {
|
if (k > 100) {
|
||||||
binomialCoefficient(n - 100, k - 100);
|
binomialCoefficient(n - 100, k - 100);
|
||||||
}
|
}
|
||||||
result = MathUtils.addAndCheck(binomialCoefficient(n - 1, k - 1),
|
result = ArithmeticsUtils.addAndCheck(binomialCoefficient(n - 1, k - 1),
|
||||||
binomialCoefficient(n - 1, k));
|
binomialCoefficient(n - 1, k));
|
||||||
}
|
}
|
||||||
if (result == -1) {
|
if (result == -1) {
|
||||||
|
@ -78,17 +78,6 @@ public final class MathUtilsTest {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Exact direct multiplication implementation to test against
|
|
||||||
*/
|
|
||||||
private long factorial(int n) {
|
|
||||||
long result = 1;
|
|
||||||
for (int i = 2; i <= n; i++) {
|
|
||||||
result *= i;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Verify that b(0,0) = 1 */
|
/** Verify that b(0,0) = 1 */
|
||||||
@Test
|
@Test
|
||||||
public void test0Choose0() {
|
public void test0Choose0() {
|
||||||
|
@ -97,50 +86,6 @@ public final class MathUtilsTest {
|
||||||
Assert.assertEquals(MathUtils.binomialCoefficient(0, 0), 1);
|
Assert.assertEquals(MathUtils.binomialCoefficient(0, 0), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAddAndCheck() {
|
|
||||||
int big = Integer.MAX_VALUE;
|
|
||||||
int bigNeg = Integer.MIN_VALUE;
|
|
||||||
Assert.assertEquals(big, MathUtils.addAndCheck(big, 0));
|
|
||||||
try {
|
|
||||||
MathUtils.addAndCheck(big, 1);
|
|
||||||
Assert.fail("Expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException ex) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
MathUtils.addAndCheck(bigNeg, -1);
|
|
||||||
Assert.fail("Expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException ex) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAddAndCheckLong() {
|
|
||||||
long max = Long.MAX_VALUE;
|
|
||||||
long min = Long.MIN_VALUE;
|
|
||||||
Assert.assertEquals(max, MathUtils.addAndCheck(max, 0L));
|
|
||||||
Assert.assertEquals(min, MathUtils.addAndCheck(min, 0L));
|
|
||||||
Assert.assertEquals(max, MathUtils.addAndCheck(0L, max));
|
|
||||||
Assert.assertEquals(min, MathUtils.addAndCheck(0L, min));
|
|
||||||
Assert.assertEquals(1, MathUtils.addAndCheck(-1L, 2L));
|
|
||||||
Assert.assertEquals(1, MathUtils.addAndCheck(2L, -1L));
|
|
||||||
Assert.assertEquals(-3, MathUtils.addAndCheck(-2L, -1L));
|
|
||||||
Assert.assertEquals(min, MathUtils.addAndCheck(min + 1, -1L));
|
|
||||||
testAddAndCheckLongFailure(max, 1L);
|
|
||||||
testAddAndCheckLongFailure(min, -1L);
|
|
||||||
testAddAndCheckLongFailure(1L, max);
|
|
||||||
testAddAndCheckLongFailure(-1L, min);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void testAddAndCheckLongFailure(long a, long b) {
|
|
||||||
try {
|
|
||||||
MathUtils.addAndCheck(a, b);
|
|
||||||
Assert.fail("Expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException ex) {
|
|
||||||
// success
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBinomialCoefficient() {
|
public void testBinomialCoefficient() {
|
||||||
long[] bcoef5 = {
|
long[] bcoef5 = {
|
||||||
|
@ -318,176 +263,6 @@ public final class MathUtilsTest {
|
||||||
Assert.assertTrue(Double.isNaN(MathUtils.cosh(Double.NaN)));
|
Assert.assertTrue(Double.isNaN(MathUtils.cosh(Double.NaN)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFactorial() {
|
|
||||||
for (int i = 1; i < 21; i++) {
|
|
||||||
Assert.assertEquals(i + "! ", factorial(i), MathUtils.factorial(i));
|
|
||||||
Assert.assertEquals(i + "! ", factorial(i), MathUtils.factorialDouble(i), Double.MIN_VALUE);
|
|
||||||
Assert.assertEquals(i + "! ", FastMath.log(factorial(i)), MathUtils.factorialLog(i), 10E-12);
|
|
||||||
}
|
|
||||||
|
|
||||||
Assert.assertEquals("0", 1, MathUtils.factorial(0));
|
|
||||||
Assert.assertEquals("0", 1.0d, MathUtils.factorialDouble(0), 1E-14);
|
|
||||||
Assert.assertEquals("0", 0.0d, MathUtils.factorialLog(0), 1E-14);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testFactorialFail() {
|
|
||||||
try {
|
|
||||||
MathUtils.factorial(-1);
|
|
||||||
Assert.fail("expecting MathIllegalArgumentException");
|
|
||||||
} catch (MathIllegalArgumentException ex) {
|
|
||||||
// ignored
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
MathUtils.factorialDouble(-1);
|
|
||||||
Assert.fail("expecting MathIllegalArgumentException");
|
|
||||||
} catch (MathIllegalArgumentException ex) {
|
|
||||||
// ignored
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
MathUtils.factorialLog(-1);
|
|
||||||
Assert.fail("expecting MathIllegalArgumentException");
|
|
||||||
} catch (MathIllegalArgumentException ex) {
|
|
||||||
// ignored
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
MathUtils.factorial(21);
|
|
||||||
Assert.fail("expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException ex) {
|
|
||||||
// ignored
|
|
||||||
}
|
|
||||||
Assert.assertTrue("expecting infinite factorial value", Double.isInfinite(MathUtils.factorialDouble(171)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGcd() {
|
|
||||||
int a = 30;
|
|
||||||
int b = 50;
|
|
||||||
int c = 77;
|
|
||||||
|
|
||||||
Assert.assertEquals(0, MathUtils.gcd(0, 0));
|
|
||||||
|
|
||||||
Assert.assertEquals(b, MathUtils.gcd(0, b));
|
|
||||||
Assert.assertEquals(a, MathUtils.gcd(a, 0));
|
|
||||||
Assert.assertEquals(b, MathUtils.gcd(0, -b));
|
|
||||||
Assert.assertEquals(a, MathUtils.gcd(-a, 0));
|
|
||||||
|
|
||||||
Assert.assertEquals(10, MathUtils.gcd(a, b));
|
|
||||||
Assert.assertEquals(10, MathUtils.gcd(-a, b));
|
|
||||||
Assert.assertEquals(10, MathUtils.gcd(a, -b));
|
|
||||||
Assert.assertEquals(10, MathUtils.gcd(-a, -b));
|
|
||||||
|
|
||||||
Assert.assertEquals(1, MathUtils.gcd(a, c));
|
|
||||||
Assert.assertEquals(1, MathUtils.gcd(-a, c));
|
|
||||||
Assert.assertEquals(1, MathUtils.gcd(a, -c));
|
|
||||||
Assert.assertEquals(1, MathUtils.gcd(-a, -c));
|
|
||||||
|
|
||||||
Assert.assertEquals(3 * (1<<15), MathUtils.gcd(3 * (1<<20), 9 * (1<<15)));
|
|
||||||
|
|
||||||
Assert.assertEquals(Integer.MAX_VALUE, MathUtils.gcd(Integer.MAX_VALUE, 0));
|
|
||||||
Assert.assertEquals(Integer.MAX_VALUE, MathUtils.gcd(-Integer.MAX_VALUE, 0));
|
|
||||||
Assert.assertEquals(1<<30, MathUtils.gcd(1<<30, -Integer.MIN_VALUE));
|
|
||||||
try {
|
|
||||||
// gcd(Integer.MIN_VALUE, 0) > Integer.MAX_VALUE
|
|
||||||
MathUtils.gcd(Integer.MIN_VALUE, 0);
|
|
||||||
Assert.fail("expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException expected) {
|
|
||||||
// expected
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
// gcd(0, Integer.MIN_VALUE) > Integer.MAX_VALUE
|
|
||||||
MathUtils.gcd(0, Integer.MIN_VALUE);
|
|
||||||
Assert.fail("expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException expected) {
|
|
||||||
// expected
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
// gcd(Integer.MIN_VALUE, Integer.MIN_VALUE) > Integer.MAX_VALUE
|
|
||||||
MathUtils.gcd(Integer.MIN_VALUE, Integer.MIN_VALUE);
|
|
||||||
Assert.fail("expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException expected) {
|
|
||||||
// expected
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGcdLong(){
|
|
||||||
long a = 30;
|
|
||||||
long b = 50;
|
|
||||||
long c = 77;
|
|
||||||
|
|
||||||
Assert.assertEquals(0, MathUtils.gcd(0L, 0));
|
|
||||||
|
|
||||||
Assert.assertEquals(b, MathUtils.gcd(0, b));
|
|
||||||
Assert.assertEquals(a, MathUtils.gcd(a, 0));
|
|
||||||
Assert.assertEquals(b, MathUtils.gcd(0, -b));
|
|
||||||
Assert.assertEquals(a, MathUtils.gcd(-a, 0));
|
|
||||||
|
|
||||||
Assert.assertEquals(10, MathUtils.gcd(a, b));
|
|
||||||
Assert.assertEquals(10, MathUtils.gcd(-a, b));
|
|
||||||
Assert.assertEquals(10, MathUtils.gcd(a, -b));
|
|
||||||
Assert.assertEquals(10, MathUtils.gcd(-a, -b));
|
|
||||||
|
|
||||||
Assert.assertEquals(1, MathUtils.gcd(a, c));
|
|
||||||
Assert.assertEquals(1, MathUtils.gcd(-a, c));
|
|
||||||
Assert.assertEquals(1, MathUtils.gcd(a, -c));
|
|
||||||
Assert.assertEquals(1, MathUtils.gcd(-a, -c));
|
|
||||||
|
|
||||||
Assert.assertEquals(3L * (1L<<45), MathUtils.gcd(3L * (1L<<50), 9L * (1L<<45)));
|
|
||||||
|
|
||||||
Assert.assertEquals(1L<<45, MathUtils.gcd(1L<<45, Long.MIN_VALUE));
|
|
||||||
|
|
||||||
Assert.assertEquals(Long.MAX_VALUE, MathUtils.gcd(Long.MAX_VALUE, 0L));
|
|
||||||
Assert.assertEquals(Long.MAX_VALUE, MathUtils.gcd(-Long.MAX_VALUE, 0L));
|
|
||||||
Assert.assertEquals(1, MathUtils.gcd(60247241209L, 153092023L));
|
|
||||||
try {
|
|
||||||
// gcd(Long.MIN_VALUE, 0) > Long.MAX_VALUE
|
|
||||||
MathUtils.gcd(Long.MIN_VALUE, 0);
|
|
||||||
Assert.fail("expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException expected) {
|
|
||||||
// expected
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
// gcd(0, Long.MIN_VALUE) > Long.MAX_VALUE
|
|
||||||
MathUtils.gcd(0, Long.MIN_VALUE);
|
|
||||||
Assert.fail("expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException expected) {
|
|
||||||
// expected
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
// gcd(Long.MIN_VALUE, Long.MIN_VALUE) > Long.MAX_VALUE
|
|
||||||
MathUtils.gcd(Long.MIN_VALUE, Long.MIN_VALUE);
|
|
||||||
Assert.fail("expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException expected) {
|
|
||||||
// expected
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGcdConsistency() {
|
|
||||||
int[] primeList = {19, 23, 53, 67, 73, 79, 101, 103, 111, 131};
|
|
||||||
ArrayList<Integer> primes = new ArrayList<Integer>();
|
|
||||||
for (int i = 0; i < primeList.length; i++) {
|
|
||||||
primes.add(Integer.valueOf(primeList[i]));
|
|
||||||
}
|
|
||||||
RandomDataImpl randomData = new RandomDataImpl();
|
|
||||||
for (int i = 0; i < 20; i++) {
|
|
||||||
Object[] sample = randomData.nextSample(primes, 4);
|
|
||||||
int p1 = ((Integer) sample[0]).intValue();
|
|
||||||
int p2 = ((Integer) sample[1]).intValue();
|
|
||||||
int p3 = ((Integer) sample[2]).intValue();
|
|
||||||
int p4 = ((Integer) sample[3]).intValue();
|
|
||||||
int i1 = p1 * p2 * p3;
|
|
||||||
int i2 = p1 * p2 * p4;
|
|
||||||
int gcd = p1 * p2;
|
|
||||||
Assert.assertEquals(gcd, MathUtils.gcd(i1, i2));
|
|
||||||
long l1 = i1;
|
|
||||||
long l2 = i2;
|
|
||||||
Assert.assertEquals(gcd, MathUtils.gcd(l1, l2));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testHash() {
|
public void testHash() {
|
||||||
double[] testArray = {
|
double[] testArray = {
|
||||||
|
@ -1106,62 +881,6 @@ public final class MathUtilsTest {
|
||||||
Assert.assertTrue(Double.isNaN(MathUtils.sinh(Double.NaN)));
|
Assert.assertTrue(Double.isNaN(MathUtils.sinh(Double.NaN)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSubAndCheck() {
|
|
||||||
int big = Integer.MAX_VALUE;
|
|
||||||
int bigNeg = Integer.MIN_VALUE;
|
|
||||||
Assert.assertEquals(big, MathUtils.subAndCheck(big, 0));
|
|
||||||
Assert.assertEquals(bigNeg + 1, MathUtils.subAndCheck(bigNeg, -1));
|
|
||||||
Assert.assertEquals(-1, MathUtils.subAndCheck(bigNeg, -big));
|
|
||||||
try {
|
|
||||||
MathUtils.subAndCheck(big, -1);
|
|
||||||
Assert.fail("Expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException ex) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
MathUtils.subAndCheck(bigNeg, 1);
|
|
||||||
Assert.fail("Expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException ex) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSubAndCheckErrorMessage() {
|
|
||||||
int big = Integer.MAX_VALUE;
|
|
||||||
try {
|
|
||||||
MathUtils.subAndCheck(big, -1);
|
|
||||||
Assert.fail("Expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException ex) {
|
|
||||||
Assert.assertTrue(ex.getMessage().length() > 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSubAndCheckLong() {
|
|
||||||
long max = Long.MAX_VALUE;
|
|
||||||
long min = Long.MIN_VALUE;
|
|
||||||
Assert.assertEquals(max, MathUtils.subAndCheck(max, 0));
|
|
||||||
Assert.assertEquals(min, MathUtils.subAndCheck(min, 0));
|
|
||||||
Assert.assertEquals(-max, MathUtils.subAndCheck(0, max));
|
|
||||||
Assert.assertEquals(min + 1, MathUtils.subAndCheck(min, -1));
|
|
||||||
// min == -1-max
|
|
||||||
Assert.assertEquals(-1, MathUtils.subAndCheck(-max - 1, -max));
|
|
||||||
Assert.assertEquals(max, MathUtils.subAndCheck(-1, -1 - max));
|
|
||||||
testSubAndCheckLongFailure(0L, min);
|
|
||||||
testSubAndCheckLongFailure(max, -1L);
|
|
||||||
testSubAndCheckLongFailure(min, 1L);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void testSubAndCheckLongFailure(long a, long b) {
|
|
||||||
try {
|
|
||||||
MathUtils.subAndCheck(a, b);
|
|
||||||
Assert.fail("Expecting MathArithmeticException");
|
|
||||||
} catch (MathArithmeticException ex) {
|
|
||||||
// success
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPow() {
|
public void testPow() {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue