1 package net.sf.openrocket.util;
3 import static java.lang.Double.NaN;
4 import static java.lang.Math.PI;
5 import static org.junit.Assert.*;
7 import java.util.ArrayList;
10 import org.junit.Test;
12 public class MathUtilTest {
14 public static final double EPS = 0.00000000001;
17 public void miscMathTest() {
19 assertEquals(PI * PI, MathUtil.pow2(PI), EPS);
20 assertEquals(PI * PI * PI, MathUtil.pow3(PI), EPS);
21 assertEquals(PI * PI * PI * PI, MathUtil.pow4(PI), EPS);
23 assertEquals(1.0, MathUtil.clamp(0.9999, 1.0, 2.0), 0);
24 assertEquals(1.23, MathUtil.clamp(1.23, 1.0, 2.0), 0);
25 assertEquals(2.0, MathUtil.clamp(2 + EPS / 100, 1.0, 2.0), 0);
27 assertEquals(1.0f, MathUtil.clamp(0.9999f, 1.0f, 2.0f), 0);
28 assertEquals(1.23f, MathUtil.clamp(1.23f, 1.0f, 2.0f), 0);
29 assertEquals(2.0f, MathUtil.clamp(2.0001f, 1.0f, 2.0f), 0);
31 assertEquals(1, MathUtil.clamp(-3, 1, 5));
32 assertEquals(3, MathUtil.clamp(3, 1, 5));
33 assertEquals(5, MathUtil.clamp(6, 1, 5));
35 assertEquals(-1.0, MathUtil.sign(Double.NEGATIVE_INFINITY), EPS);
36 assertEquals(-1.0, MathUtil.sign(-100), EPS);
37 assertEquals(-1.0, MathUtil.sign(Math.nextAfter(0.0, -1.0)), EPS);
38 assertEquals(1.0, MathUtil.sign(Math.nextUp(0.0)), EPS);
39 assertEquals(1.0, MathUtil.sign(100), EPS);
40 assertEquals(1.0, MathUtil.sign(Double.POSITIVE_INFINITY), EPS);
44 public void hypotTest() {
46 for (int i = 0; i < 10000; i++) {
47 double x = Math.random() * 100 - 50;
48 double y = Math.random() * i - i / 2;
49 double z = Math.hypot(x, y);
50 assertEquals(z, MathUtil.hypot(x, y), EPS);
56 public void reduceTest() {
58 for (int i = -1000; i < 1000; i++) {
59 double angle = Math.random() * 2 * PI;
60 double shift = angle + i * 2 * PI;
61 assertEquals(angle, MathUtil.reduce360(shift), EPS);
64 for (int i = -1000; i < 1000; i++) {
65 double angle = Math.random() * 2 * PI - PI;
66 double shift = angle + i * 2 * PI;
67 assertEquals(angle, MathUtil.reduce180(shift), EPS);
73 public void minmaxTest() {
74 assertEquals(1.0, MathUtil.min(1.0, Math.nextUp(1.0)), 0);
75 assertEquals(1.0, MathUtil.min(1.0, Double.POSITIVE_INFINITY), 0);
76 assertEquals(1.0, MathUtil.min(NaN, 1.0), 0);
77 assertEquals(1.0, MathUtil.min(1.0, NaN), 0);
78 assertEquals(NaN, MathUtil.min(NaN, NaN), 0);
80 assertEquals(Math.nextUp(1.0), MathUtil.max(1.0, Math.nextUp(1.0)), 0);
81 assertEquals(Double.POSITIVE_INFINITY, MathUtil.max(1.0, Double.POSITIVE_INFINITY), 0);
82 assertEquals(1.0, MathUtil.max(NaN, 1.0), 0);
83 assertEquals(1.0, MathUtil.max(1.0, NaN), 0);
84 assertEquals(NaN, MathUtil.max(NaN, NaN), 0);
86 assertEquals(1.0, MathUtil.min(1.0, 2.0, 3.0), 0);
87 assertEquals(1.0, MathUtil.min(1.0, NaN, NaN), 0);
88 assertEquals(1.0, MathUtil.min(NaN, 1.0, NaN), 0);
89 assertEquals(1.0, MathUtil.min(NaN, NaN, 1.0), 0);
90 assertEquals(1.0, MathUtil.min(2.0, NaN, 1.0), 0);
91 assertEquals(1.0, MathUtil.min(1.0, 2.0, NaN), 0);
92 assertEquals(1.0, MathUtil.min(NaN, 2.0, 1.0), 0);
94 assertEquals(3.0, MathUtil.max(1.0, 3.0, 2.0), 0);
95 assertEquals(1.0, MathUtil.max(1.0, NaN, NaN), 0);
96 assertEquals(1.0, MathUtil.max(NaN, 1.0, NaN), 0);
97 assertEquals(1.0, MathUtil.max(NaN, NaN, 1.0), 0);
98 assertEquals(2.0, MathUtil.max(2.0, NaN, 1.0), 0);
99 assertEquals(2.0, MathUtil.max(1.0, 2.0, NaN), 0);
100 assertEquals(2.0, MathUtil.max(NaN, 2.0, 1.0), 0);
102 assertEquals(1.0, MathUtil.min(1.0, 2.0, 3.0, 4.0), 0);
103 assertEquals(1.0, MathUtil.min(1.0, NaN, NaN, NaN), 0);
104 assertEquals(1.0, MathUtil.min(NaN, 1.0, NaN, NaN), 0);
105 assertEquals(1.0, MathUtil.min(NaN, NaN, 1.0, NaN), 0);
106 assertEquals(1.0, MathUtil.min(2.0, NaN, 1.0, NaN), 0);
107 assertEquals(1.0, MathUtil.min(2.0, NaN, NaN, 1.0), 0);
108 assertEquals(1.0, MathUtil.min(1.0, 2.0, NaN, 3.0), 0);
109 assertEquals(1.0, MathUtil.min(NaN, 2.0, 3.0, 1.0), 0);
114 public void mapTest() {
115 assertEquals(1.0, MathUtil.map(1.0, 0.0, 5.0, -1.0, 9.0), EPS);
116 assertEquals(7.0, MathUtil.map(1.0, 5.0, 0.0, -1.0, 9.0), EPS);
117 assertEquals(7.0, MathUtil.map(1.0, 0.0, 5.0, 9.0, -1.0), EPS);
118 assertEquals(6.0, MathUtil.map(6.0, 0.0, 5.0, Math.nextUp(6.0), 6.0), EPS);
119 assertEquals(6.0, MathUtil.map(6.0, 0.0, 0.0, Math.nextUp(6.0), 6.0), EPS);
121 MathUtil.map(6.0, 1.0, Math.nextUp(1.0), 1.0, 2.0);
122 fail("Should not be reached.");
123 } catch (IllegalArgumentException normal) {
126 assertEquals(7.0, MathUtil.map(Math.nextUp(1.0), 0.0, 5.0, 9.0, -1.0), EPS);
131 public void mapCoordinateTest() {
132 assertEquals(new Coordinate(0.8, 2.0, 1.6, 4.0),
133 MathUtil.map(1.0, 0.0, 5.0, new Coordinate(0, 1, 2, 3), new Coordinate(4, 6, 0, 8)));
138 public void equalsTest() {
139 assertTrue(MathUtil.equals(1.0, 1.0 + MathUtil.EPSILON / 3));
140 assertFalse(MathUtil.equals(1.0, 1.0 + MathUtil.EPSILON * 2));
141 assertTrue(MathUtil.equals(-1.0, -1.0 + MathUtil.EPSILON / 3));
142 assertFalse(MathUtil.equals(-1.0, -1.0 + MathUtil.EPSILON * 2));
144 for (double zero : new double[] { 0.0, MathUtil.EPSILON / 10, -MathUtil.EPSILON / 10 }) {
146 assertTrue(MathUtil.equals(zero, MathUtil.EPSILON / 3));
147 assertTrue(MathUtil.equals(zero, -MathUtil.EPSILON / 3));
148 assertFalse(MathUtil.equals(zero, MathUtil.EPSILON * 2));
149 assertFalse(MathUtil.equals(zero, -MathUtil.EPSILON * 2));
151 assertTrue(MathUtil.equals(MathUtil.EPSILON / 3, zero));
152 assertTrue(MathUtil.equals(-MathUtil.EPSILON / 3, zero));
153 assertFalse(MathUtil.equals(MathUtil.EPSILON * 2, zero));
154 assertFalse(MathUtil.equals(-MathUtil.EPSILON * 2, zero));
158 for (double value : new double[] { PI * 1e20, -PI * 1e20 }) {
159 assertTrue("value=" + value, MathUtil.equals(value, value + 1));
160 assertTrue("value=" + value, MathUtil.equals(value, Math.nextUp(value)));
161 assertTrue("value=" + value, MathUtil.equals(value, value * (1 + MathUtil.EPSILON)));
164 assertFalse(MathUtil.equals(NaN, 0.0));
165 assertFalse(MathUtil.equals(0.0, NaN));
166 assertFalse(MathUtil.equals(NaN, NaN));
170 public void testAverageStddev() {
171 List<Integer> ints = new ArrayList<Integer>();
172 List<Double> doubles = new ArrayList<Double>();
186 assertEquals(4.75, MathUtil.average(ints), EPS);
187 assertEquals(1.707825127659933, MathUtil.stddev(ints), EPS);
188 assertEquals(4.771666666666667, MathUtil.average(doubles), EPS);
189 assertEquals(2.024454659078999, MathUtil.stddev(doubles), EPS);
193 public void testMedian() {
194 List<Integer> ints = new ArrayList<Integer>();
195 List<Double> doubles = new ArrayList<Double>();
209 assertEquals(4.5, MathUtil.median(ints), EPS);
210 assertEquals(4.415, MathUtil.median(doubles), EPS);
215 assertEquals(5, MathUtil.median(ints), EPS);
216 assertEquals(5.43, MathUtil.median(doubles), EPS);