001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.math.util;
018    
019    import static org.junit.Assert.assertEquals;
020    import static org.junit.Assert.assertFalse;
021    import static org.junit.Assert.assertTrue;
022    
023    import java.math.BigDecimal;
024    import java.math.BigInteger;
025    import java.math.MathContext;
026    
027    import org.apache.commons.math.TestUtils;
028    import org.junit.Test;
029    
030    public class BigRealTest {
031    
032        @Test
033        public void testConstructor() {
034            assertEquals(1.625, new BigReal(new BigDecimal("1.625")).doubleValue(), 1.0e-15);
035            assertEquals(-5.0, new BigReal(new BigInteger("-5")).doubleValue(), 1.0e-15);
036            assertEquals(-5.0, new BigReal(new BigInteger("-5"), MathContext.DECIMAL64).doubleValue(), 1.0e-15);
037            assertEquals(0.125, new BigReal(new BigInteger("125"), 3).doubleValue(), 1.0e-15);
038            assertEquals(0.125, new BigReal(new BigInteger("125"), 3, MathContext.DECIMAL64).doubleValue(), 1.0e-15);
039            assertEquals(1.625, new BigReal(new char[] { '1', '.', '6', '2', '5' }).doubleValue(), 1.0e-15);
040            assertEquals(1.625, new BigReal(new char[] { 'A', 'A', '1', '.', '6', '2', '5', '9' }, 2, 5).doubleValue(), 1.0e-15);
041            assertEquals(1.625, new BigReal(new char[] { 'A', 'A', '1', '.', '6', '2', '5', '9' }, 2, 5, MathContext.DECIMAL64).doubleValue(), 1.0e-15);
042            assertEquals(1.625, new BigReal(new char[] { '1', '.', '6', '2', '5' }, MathContext.DECIMAL64).doubleValue(), 1.0e-15);
043            assertEquals(1.625, new BigReal(1.625).doubleValue(), 1.0e-15);
044            assertEquals(1.625, new BigReal(1.625, MathContext.DECIMAL64).doubleValue(), 1.0e-15);
045            assertEquals(-5.0, new BigReal(-5).doubleValue(), 1.0e-15);
046            assertEquals(-5.0, new BigReal(-5, MathContext.DECIMAL64).doubleValue(), 1.0e-15);
047            assertEquals(-5.0, new BigReal(-5l).doubleValue(), 1.0e-15);
048            assertEquals(-5.0, new BigReal(-5l, MathContext.DECIMAL64).doubleValue(), 1.0e-15);
049            assertEquals(1.625, new BigReal("1.625").doubleValue(), 1.0e-15);
050            assertEquals(1.625, new BigReal("1.625", MathContext.DECIMAL64).doubleValue(), 1.0e-15);
051        }
052    
053        @Test
054        public void testCompareTo() {
055            BigReal first = new BigReal(1.0 / 2.0);
056            BigReal second = new BigReal(1.0 / 3.0);
057            BigReal third = new BigReal(1.0 / 2.0);
058    
059            assertEquals(0, first.compareTo(first));
060            assertEquals(0, first.compareTo(third));
061            assertEquals(1, first.compareTo(second));
062            assertEquals(-1, second.compareTo(first));
063    
064        }
065    
066        public void testAdd() {
067            BigReal a = new BigReal("1.2345678");
068            BigReal b = new BigReal("8.7654321");
069            assertEquals(9.9999999, a.add(b).doubleValue(), 1.0e-15);
070        }
071    
072        public void testSubtract() {
073            BigReal a = new BigReal("1.2345678");
074            BigReal b = new BigReal("8.7654321");
075            assertEquals( -7.5308643, a.subtract(b).doubleValue(), 1.0e-15);
076        }
077    
078        public void testDivide() {
079            BigReal a = new BigReal("1.0000000000");
080            BigReal b = new BigReal("0.0009765625");
081            assertEquals(1024.0, a.divide(b).doubleValue(), 1.0e-15);
082        }
083    
084        public void testMultiply() {
085            BigReal a = new BigReal("1024.0");
086            BigReal b = new BigReal("0.0009765625");
087            assertEquals(1.0, a.multiply(b).doubleValue(), 1.0e-15);
088        }
089    
090        @Test
091        public void testDoubleValue() {
092            assertEquals(0.5, new BigReal(0.5).doubleValue(), 1.0e-15);
093        }
094    
095        @Test
096        public void testBigDecimalValue() {
097            BigDecimal pi = new BigDecimal("3.1415926535897932384626433832795028841971693993751");
098            assertEquals(pi, new BigReal(pi).bigDecimalValue());
099            assertEquals(new BigDecimal(0.5), new BigReal(1.0 / 2.0).bigDecimalValue());
100        }
101    
102        @Test
103        public void testEqualsAndHashCode() {
104            BigReal zero = new BigReal(0.0);
105            BigReal nullReal = null;
106            assertTrue(zero.equals(zero));
107            assertFalse(zero.equals(nullReal));
108            assertFalse(zero.equals(Double.valueOf(0)));
109            BigReal zero2 = new BigReal(0.0);
110            assertTrue(zero.equals(zero2));
111            assertEquals(zero.hashCode(), zero2.hashCode());
112            BigReal one = new BigReal(1.0);
113            assertFalse((one.equals(zero) || zero.equals(one)));
114            assertTrue(one.equals(BigReal.ONE));
115        }
116    
117        public void testSerial() {
118            BigReal[] Reals = {
119                new BigReal(3.0), BigReal.ONE, BigReal.ZERO,
120                new BigReal(17), new BigReal(Math.PI),
121                new BigReal(-2.5)
122            };
123            for (BigReal Real : Reals) {
124                assertEquals(Real, TestUtils.serializeAndRecover(Real));
125            }
126        }
127    
128    }