blob: ddddbf018da5114c83b88dcbca1f8bba6a718da5 [file] [log] [blame]
/*
* 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.numbers.gamma;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
/**
* Tests for {@link Erf}.
*/
public class ErfTest {
@Test
public void testErf0() {
double actual = Erf.value(0);
double expected = 0;
Assert.assertEquals(expected, actual, 1e-15);
Assert.assertEquals(1 - expected, Erfc.value(0), 1e-15);
}
@Test
public void testErf1960() {
double x = 1.960 / Math.sqrt(2);
double actual = Erf.value(x);
double expected = 0.95;
Assert.assertEquals(expected, actual, 1e-5);
Assert.assertEquals(1 - actual, Erfc.value(x), 1e-15);
actual = Erf.value(-x);
expected = -expected;
Assert.assertEquals(expected, actual, 1e-5);
Assert.assertEquals(1 - actual, Erfc.value(-x), 1e-15);
}
@Test
public void testErf2576() {
double x = 2.576 / Math.sqrt(2);
double actual = Erf.value(x);
double expected = 0.99;
Assert.assertEquals(expected, actual, 1e-5);
Assert.assertEquals(1 - actual, Erfc.value(x), 1e-15);
actual = Erf.value(-x);
expected = -expected;
Assert.assertEquals(expected, actual, 1e-5);
Assert.assertEquals(1 - actual, Erfc.value(-x), 1e-15);
}
@Test
public void testErf2807() {
double x = 2.807 / Math.sqrt(2);
double actual = Erf.value(x);
double expected = 0.995;
Assert.assertEquals(expected, actual, 1e-5);
Assert.assertEquals(1 - actual, Erfc.value(x), 1e-15);
actual = Erf.value(-x);
expected = -expected;
Assert.assertEquals(expected, actual, 1e-5);
Assert.assertEquals(1 - actual, Erfc.value(-x), 1e-15);
}
@Test
public void testErf3291() {
double x = 3.291 / Math.sqrt(2);
double actual = Erf.value(x);
double expected = 0.999;
Assert.assertEquals(expected, actual, 1e-5);
Assert.assertEquals(1 - expected, Erfc.value(x), 1e-5);
actual = Erf.value(-x);
expected = -expected;
Assert.assertEquals(expected, actual, 1e-5);
Assert.assertEquals(1 - expected, Erfc.value(-x), 1e-5);
}
/**
* MATH-301, MATH-456
*/
@Test
public void testLargeValues() {
for (int i = 1; i < 200; i *= 10) {
double result = Erf.value(i);
Assert.assertFalse(Double.isNaN(result));
Assert.assertTrue(result > 0 && result <= 1);
result = Erf.value(-i);
Assert.assertFalse(Double.isNaN(result));
Assert.assertTrue(result >= -1 && result < 0);
result = Erfc.value(i);
Assert.assertFalse(Double.isNaN(result));
Assert.assertTrue(result >= 0 && result < 1);
result = Erfc.value(-i);
Assert.assertFalse(Double.isNaN(result));
Assert.assertTrue(result >= 1 && result <= 2);
}
Assert.assertEquals(-1, Erf.value(Double.NEGATIVE_INFINITY), 0);
Assert.assertEquals(1, Erf.value(Double.POSITIVE_INFINITY), 0);
Assert.assertEquals(2, Erfc.value(Double.NEGATIVE_INFINITY), 0);
Assert.assertEquals(0, Erfc.value(Double.POSITIVE_INFINITY), 0);
}
/**
* Compare Erf.value against reference values computed using GCC 4.2.1
* (Apple OSX packaged version) erfl (extended precision erf).
*/
@Test
public void testErfGnu() {
final double tol = 1E-15;
final double[] gnuValues = new double[] {
-1, -1, -1, -1, -1,
-1, -1, -1, -0.99999999999999997848,
-0.99999999999999264217, -0.99999999999846254017, -0.99999999980338395581, -0.99999998458274209971,
-0.9999992569016276586, -0.99997790950300141459, -0.99959304798255504108, -0.99532226501895273415,
-0.96610514647531072711, -0.84270079294971486948, -0.52049987781304653809, 0,
0.52049987781304653809, 0.84270079294971486948, 0.96610514647531072711, 0.99532226501895273415,
0.99959304798255504108, 0.99997790950300141459, 0.9999992569016276586, 0.99999998458274209971,
0.99999999980338395581, 0.99999999999846254017, 0.99999999999999264217, 0.99999999999999997848,
1, 1, 1, 1,
1, 1, 1, 1};
double x = -10;
for (int i = 0; i < 41; i++) {
Assert.assertEquals(gnuValues[i], Erf.value(x), tol);
x += 0.5d;
}
}
}