1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math4.legacy.linear;
18
19 import java.math.BigDecimal;
20 import java.math.BigInteger;
21 import java.math.MathContext;
22
23 import org.apache.commons.math4.legacy.TestUtils;
24 import org.apache.commons.math4.legacy.exception.MathArithmeticException;
25 import org.apache.commons.math4.core.jdkmath.JdkMath;
26 import org.junit.Assert;
27 import org.junit.Test;
28
29 public class BigRealTest {
30
31 @Test
32 public void testConstructor() {
33 Assert.assertEquals(1.625,
34 new BigReal(new BigDecimal("1.625")).doubleValue(),
35 1.0e-15);
36 Assert.assertEquals(-5.0,
37 new BigReal(new BigInteger("-5")).doubleValue(),
38 1.0e-15);
39 Assert.assertEquals(-5.0, new BigReal(new BigInteger("-5"),
40 MathContext.DECIMAL64)
41 .doubleValue(), 1.0e-15);
42 Assert
43 .assertEquals(0.125,
44 new BigReal(new BigInteger("125"), 3).doubleValue(),
45 1.0e-15);
46 Assert.assertEquals(0.125, new BigReal(new BigInteger("125"), 3,
47 MathContext.DECIMAL64)
48 .doubleValue(), 1.0e-15);
49 Assert.assertEquals(1.625, new BigReal(new char[] {
50 '1', '.', '6', '2', '5'
51 }).doubleValue(), 1.0e-15);
52 Assert.assertEquals(1.625, new BigReal(new char[] {
53 'A', 'A', '1', '.', '6', '2', '5', '9'
54 }, 2, 5).doubleValue(), 1.0e-15);
55 Assert.assertEquals(1.625, new BigReal(new char[] {
56 'A', 'A', '1', '.', '6', '2', '5', '9'
57 }, 2, 5, MathContext.DECIMAL64).doubleValue(), 1.0e-15);
58 Assert.assertEquals(1.625, new BigReal(new char[] {
59 '1', '.', '6', '2', '5'
60 }, MathContext.DECIMAL64).doubleValue(), 1.0e-15);
61 Assert.assertEquals(1.625, new BigReal(1.625).doubleValue(), 1.0e-15);
62 Assert.assertEquals(1.625, new BigReal(1.625, MathContext.DECIMAL64)
63 .doubleValue(), 1.0e-15);
64 Assert.assertEquals(-5.0, new BigReal(-5).doubleValue(), 1.0e-15);
65 Assert.assertEquals(-5.0, new BigReal(-5, MathContext.DECIMAL64)
66 .doubleValue(), 1.0e-15);
67 Assert.assertEquals(-5.0, new BigReal(-5L).doubleValue(), 1.0e-15);
68 Assert.assertEquals(-5.0, new BigReal(-5L, MathContext.DECIMAL64)
69 .doubleValue(), 1.0e-15);
70 Assert.assertEquals(1.625, new BigReal("1.625").doubleValue(), 1.0e-15);
71 Assert.assertEquals(1.625, new BigReal("1.625", MathContext.DECIMAL64)
72 .doubleValue(), 1.0e-15);
73 }
74
75 @Test
76 public void testCompareTo() {
77 BigReal first = new BigReal(1.0 / 2.0);
78 BigReal second = new BigReal(1.0 / 3.0);
79 BigReal third = new BigReal(1.0 / 2.0);
80
81 Assert.assertEquals(0, first.compareTo(first));
82 Assert.assertEquals(0, first.compareTo(third));
83 Assert.assertEquals(1, first.compareTo(second));
84 Assert.assertEquals(-1, second.compareTo(first));
85 }
86
87 @Test
88 public void testAdd() {
89 BigReal a = new BigReal("1.2345678");
90 BigReal b = new BigReal("8.7654321");
91 Assert.assertEquals(9.9999999, a.add(b).doubleValue(), 1.0e-15);
92 }
93
94 @Test
95 public void testSubtract() {
96 BigReal a = new BigReal("1.2345678");
97 BigReal b = new BigReal("8.7654321");
98 Assert.assertEquals(-7.5308643, a.subtract(b).doubleValue(), 1.0e-15);
99 }
100
101 @Test
102 public void testNegate() {
103 BigReal a = new BigReal("1.2345678");
104 BigReal zero = new BigReal("0.0000000");
105 Assert.assertEquals(a.negate().add(a), zero);
106 Assert.assertEquals(a.add(a.negate()), zero);
107 Assert.assertEquals(zero, zero.negate());
108 }
109
110 @Test
111 public void testDivide() {
112 BigReal a = new BigReal("1.0000000000");
113 BigReal b = new BigReal("0.0009765625");
114 Assert.assertEquals(1024.0, a.divide(b).doubleValue(), 1.0e-15);
115 }
116
117 @Test(expected = MathArithmeticException.class)
118 public void testDivisionByZero() {
119 final BigReal a = BigReal.ONE;
120 final BigReal b = BigReal.ZERO;
121 a.divide(b);
122 }
123
124 @Test
125 public void testReciprocal() {
126 BigReal a = new BigReal("1.2345678");
127 double eps = JdkMath.pow(10., -a.getScale());
128 BigReal one = new BigReal("1.0000000");
129 BigReal b = a.reciprocal();
130 BigReal r = one.subtract(a.multiply(b));
131 Assert.assertTrue(JdkMath.abs(r.doubleValue()) <= eps);
132 r = one.subtract(b.multiply(a));
133 Assert.assertTrue(JdkMath.abs(r.doubleValue()) <= eps);
134 }
135
136 @Test(expected = MathArithmeticException.class)
137 public void testReciprocalOfZero() {
138 BigReal.ZERO.reciprocal();
139 }
140
141 @Test
142 public void testMultiply() {
143 BigReal a = new BigReal("1024.0");
144 BigReal b = new BigReal("0.0009765625");
145 Assert.assertEquals(1.0, a.multiply(b).doubleValue(), 1.0e-15);
146 int n = 1024;
147 Assert.assertEquals(1.0, b.multiply(n).doubleValue(), 1.0e-15);
148 }
149
150 @Test
151 public void testDoubleValue() {
152 Assert.assertEquals(0.5, new BigReal(0.5).doubleValue(), 1.0e-15);
153 }
154
155 @Test
156 public void testBigDecimalValue() {
157 BigDecimal pi = new BigDecimal(
158 "3.1415926535897932384626433832795028841971693993751");
159 Assert.assertEquals(pi, new BigReal(pi).bigDecimalValue());
160 Assert.assertEquals(new BigDecimal(0.5),
161 new BigReal(1.0 / 2.0).bigDecimalValue());
162 }
163
164 @Test
165 public void testEqualsAndHashCode() {
166 BigReal zero = new BigReal(0.0);
167 BigReal nullReal = null;
168 Assert.assertEquals(zero, zero);
169 Assert.assertNotEquals(zero, nullReal);
170 Assert.assertFalse(zero.equals(Double.valueOf(0)));
171 BigReal zero2 = new BigReal(0.0);
172 Assert.assertEquals(zero, zero2);
173 Assert.assertEquals(zero.hashCode(), zero2.hashCode());
174 BigReal one = new BigReal(1.0);
175 Assert.assertFalse(one.equals(zero) || zero.equals(one));
176 Assert.assertEquals(one, BigReal.ONE);
177 BigReal oneWithScaleOne = new BigReal(new BigDecimal("1.0"));
178 BigReal oneWithScaleTwo = new BigReal(new BigDecimal("1.00"));
179 Assert.assertEquals(oneWithScaleOne, oneWithScaleTwo);
180 Assert.assertEquals(oneWithScaleOne.hashCode(), oneWithScaleTwo.hashCode());
181 }
182
183 @Test
184 public void testSerial() {
185 BigReal[] Reals = {
186 new BigReal(3.0), BigReal.ONE, BigReal.ZERO, new BigReal(17),
187 new BigReal(JdkMath.PI), new BigReal(-2.5)
188 };
189 for (BigReal Real : Reals) {
190 Assert.assertEquals(Real, TestUtils.serializeAndRecover(Real));
191 }
192 }
193 }