package com.compomics.util.test.math; import com.compomics.util.math.BigFunctions; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import junit.framework.Assert; import junit.framework.TestCase; import org.apache.commons.math.util.FastMath; /** * Tests for the math functions on big integers * * @author Marc Vaudel */ public class TestBigFunctions extends TestCase { /** * The math context. */ private MathContext mathContext; /** * The tolerance to use when testing the results. */ private BigDecimal tolerance; /** * Constructor. */ public TestBigFunctions() { mathContext = new MathContext(10, RoundingMode.HALF_DOWN); tolerance = new BigDecimal(FastMath.pow(10, -mathContext.getPrecision() + 1)); } /** * Tests the exp function */ public void testExp() { BigDecimal expLimit = BigFunctions.getMaxExp(mathContext); for (int i = -4; i <= 4; i++) { double x = FastMath.pow(10, i); BigDecimal xBD = new BigDecimal(x); if (xBD.compareTo(expLimit) == -1) { BigDecimal utilitiesResult = BigFunctions.exp(xBD, mathContext); if (x < 709) { double fastMathResult = FastMath.exp(x); BigDecimal fastMathResultBD = new BigDecimal(fastMathResult); BigDecimal error = utilitiesResult.subtract(fastMathResultBD); BigDecimal expTolerance = tolerance.multiply(utilitiesResult); Assert.assertEquals(-1, error.abs().compareTo(expTolerance)); } x = -x; double fastMathResult = FastMath.exp(x); BigDecimal fastMathResultBD = new BigDecimal(fastMathResult); xBD = new BigDecimal(x); utilitiesResult = BigFunctions.exp(xBD, mathContext); BigDecimal error = utilitiesResult.subtract(fastMathResultBD); Assert.assertEquals(-1, error.abs().compareTo(tolerance)); } } } /** * Tests the expBD function */ public void testExpBD() { BigDecimal expLimit = BigFunctions.getMaxExp(mathContext); for (int i = -4; i <= 4; i++) { double x = FastMath.pow(10, i); BigDecimal xBD = new BigDecimal(x); if (xBD.compareTo(expLimit) == -1) { BigDecimal utilitiesResult = BigFunctions.expBD(xBD, mathContext); if (x < 709) { double fastMathResult = FastMath.exp(x); BigDecimal fastMathResultBD = new BigDecimal(fastMathResult); BigDecimal error = utilitiesResult.subtract(fastMathResultBD); BigDecimal expTolerance = tolerance.multiply(utilitiesResult); Assert.assertEquals(-1, error.abs().compareTo(expTolerance)); } x = -x; double fastMathResult = FastMath.exp(x); BigDecimal fastMathResultBD = new BigDecimal(fastMathResult); xBD = new BigDecimal(x); utilitiesResult = BigFunctions.expBD(xBD, mathContext); BigDecimal error = utilitiesResult.subtract(fastMathResultBD); Assert.assertEquals(-1, error.abs().compareTo(tolerance)); } } } /** * Tests the ln function */ public void testLn() { for (int i = -100; i <= 100; i++) { double x = FastMath.pow(10, i); double fastMathResult = FastMath.log(x); BigDecimal fastMathResultBD = new BigDecimal(fastMathResult); BigDecimal xBD = new BigDecimal(x); BigDecimal utilitiesResult = BigFunctions.ln(xBD, mathContext); BigDecimal error = utilitiesResult.subtract(fastMathResultBD); Assert.assertEquals(-1, error.abs().compareTo(tolerance)); } } /** * Tests the lnBD function */ public void testLnBD() { for (int i = -100; i <= 100; i++) { double x = FastMath.pow(10, i); double fastMathResult = FastMath.log(x); BigDecimal fastMathResultBD = new BigDecimal(fastMathResult); BigDecimal xDB = new BigDecimal(x); BigDecimal utilitiesResult = BigFunctions.lnBD(xDB, mathContext); BigDecimal error = utilitiesResult.subtract(fastMathResultBD); Assert.assertEquals(-1, error.abs().compareTo(tolerance)); } } }