SlowCRTest.java revision a8e45a3255089266ccf6500188a2d31af8634e4a
1a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm/*
2a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * Copyright (C) 2015 The Android Open Source Project
3a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm *
4a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * Licensed under the Apache License, Version 2.0 (the "License");
5a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * you may not use this file except in compliance with the License.
6a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * You may obtain a copy of the License at
7a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm *
8a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm *   http://www.apache.org/licenses/LICENSE-2.0
9a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm *
10a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * Unless required by applicable law or agreed to in writing, software
11a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * distributed under the License is distributed on an "AS IS" BASIS,
12a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * See the License for the specific language governing permissions and
14a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm * limitations under the License.
15a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm */
16a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
17a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm/* THIS TYPICALLY TAKES > 10 MINUTES TO RUN!  It shold generate no output during that time. */
18a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
19a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmpackage com.hp.creals;
20a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
21a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmimport junit.framework.AssertionFailedError;
22a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmimport junit.framework.TestCase;
23a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
24a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmimport java.math.BigInteger;
25a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmimport java.util.Random;
26a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
27a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehmpublic class SlowCRTest extends TestCase {
28a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    private static void check(boolean x, String s) {
29a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        if (!x) throw new AssertionFailedError(s);
30a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    }
31a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static int TEST_PREC = -200; // 200 bits to the right of
32a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                                       // binary point.
33a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static int NRANDOM = 100;    // Number of random values to
34a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                                       // test.  Bigger ==> slower
35a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    private static void checkEq(CR x, CR y, String s) {
36a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        if (x.compareTo(y, TEST_PREC) != 0) throw new AssertionFailedError(s);
37a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    }
38a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    private static void checkApprEq(CR x, CR y, String s) {
39a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        BigInteger abs_difference = x.subtract(y).get_appr(TEST_PREC).abs();
40a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        if (abs_difference.compareTo(BigInteger.ONE) > 0)
41a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                throw new AssertionFailedError(s);
42a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    }
43a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    private static void checkApprEq(double x, double y, String s) {
44a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        if (Math.abs(x - y) > 0.000001) throw new AssertionFailedError(s);
45a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    }
46a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static BigInteger MASK =
47a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            BigInteger.ONE.shiftLeft(-TEST_PREC).subtract(BigInteger.ONE);
48a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    private static boolean isApprInt(CR x) {
49a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        BigInteger appr = x.get_appr(TEST_PREC);
50a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        return appr.and(MASK).signum() == 0;
51a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    }
52a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
53a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static CR ZERO = CR.valueOf(0);
54a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static CR ONE = CR.valueOf(1);
55a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static CR TWO = CR.valueOf(2);
56a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static CR BIG = CR.valueOf(200).exp();
57a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static CR SMALL = BIG.inverse();
58a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
59a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static UnaryCRFunction ASIN = UnaryCRFunction.asinFunction;
60a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static UnaryCRFunction ACOS = UnaryCRFunction.acosFunction;
61a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static UnaryCRFunction ATAN = UnaryCRFunction.atanFunction;
62a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static UnaryCRFunction TAN = UnaryCRFunction.tanFunction;
63a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    final static UnaryCRFunction COSINE = UnaryCRFunction.sinFunction
64a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                                             .monotoneDerivative(ZERO, CR.PI);
65a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
66a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    // Perform some consistency checks on trig functions at x
67a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    // We assume that x is within floating point range.
68a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    private static void checkTrig(CR x) {
69a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        double xAsDouble = x.doubleValue();
70a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        if (Math.abs(xAsDouble) < 1000000.0) {
71a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(x.sin().doubleValue(), Math.sin(xAsDouble),
72a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                          "sin float compare:" + xAsDouble);
73a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(x.cos().doubleValue(), Math.cos(xAsDouble),
74a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                          "cos float compare:" + xAsDouble);
75a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(TAN.execute(x).doubleValue(), Math.tan(xAsDouble),
76a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                          "tan float compare:" + xAsDouble);
77a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(ATAN.execute(x).doubleValue(), Math.atan(xAsDouble),
78a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                          "atan float compare:" + xAsDouble);
79a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
80a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        if (Math.abs(xAsDouble) < 1.0) {
81a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(ASIN.execute(x).doubleValue(), Math.asin(xAsDouble),
82a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                          "asin float compare:" + xAsDouble);
83a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(ACOS.execute(x).doubleValue(), Math.acos(xAsDouble),
84a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                          "acos float compare:" + xAsDouble );
85a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
86a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        if (xAsDouble < 3.1415926535 && xAsDouble > 0.0) {
87a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(COSINE.execute(x).doubleValue(), Math.cos(xAsDouble),
88a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                          "deriv(sin) float compare:"  + xAsDouble);
89a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(COSINE.execute(x), x.cos(),
90a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                          "deriv(sin) float compare:"  + xAsDouble);
91a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
92a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        // Check that sin(x+v) = sin(x)cos(v) + cos(x)sin(v)
93a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        // for a couple of different values of v.
94a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        for (int i = 1; i <= 5; ++i) {
95a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            CR v = CR.valueOf(i);
96a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(
97a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                x.add(v).sin(),
98a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                x.sin().multiply(v.cos()).add(x.cos().multiply(v.sin())),
99a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                "Angle sum formula failed for " + xAsDouble + " + " + i);
100a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
101a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(x.cos().multiply(x.cos()).add(x.sin().multiply(x.sin())),
102a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                    CR.valueOf(1),
103a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                    "sin(x)^2 + cos(x)^2 != 1:" + xAsDouble);
104a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        // Check that inverses are consistent
105a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(x, TAN.execute(ATAN.execute(x)),
106a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                      "tan(atan(" + xAsDouble + ")" );
107a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        CR tmp = ACOS.execute(x.cos());
108a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        // Result or its inverse should differ from x by an
109a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        // exact multiple of pi.
110a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        check(isApprInt(tmp.subtract(x).divide(CR.PI))
111a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm              || isApprInt(tmp.add(x).divide(CR.PI)),
112a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm              "acos(cos):" + xAsDouble);
113a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        tmp = ASIN.execute(x.sin());
114a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        // Result or its inverse should differ from x by an
115a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        // exact multiple of pi.
116a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        check(isApprInt(tmp.subtract(x).divide(CR.PI))
117a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm              || isApprInt(tmp.add(x).divide(CR.PI)),
118a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm              "acos(cos):" + xAsDouble);
119a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    }
120a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
121a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    private static void checkExpLn(CR x) {
122a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        double xAsDouble = x.doubleValue();
123a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        if (Math.abs(xAsDouble) < 10.0) {
124a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(x.exp().doubleValue(), Math.exp(xAsDouble),
125a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                          "exp float compare:" + xAsDouble);
126a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
127a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        if (Math.abs(xAsDouble) <= 1000.0) {
128a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(x, x.exp().ln(), "ln(exp) failed:" + xAsDouble);
129a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(x.multiply(CR.valueOf(2)).exp(),
130a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
131a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                        x.exp().multiply(x.exp()),
132a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                        "exp^2 failed:" + xAsDouble);
133a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
134a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        if (xAsDouble > 0.000000001) {
135a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(x.ln().doubleValue(), Math.log(xAsDouble),
136a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                          "exp float compare:" + xAsDouble);
137a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(x, x.ln().exp(), "exp(ln) failed:" + xAsDouble);
138a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(x.ln().divide(CR.valueOf(2)), x.sqrt().ln(),
139a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                        "ln(sqrt) failed:" + xAsDouble);
140a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            // Check that ln(xv) = ln(x) + ln(v) for various v
141a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            for (int i = 1; i <= 5; ++i) {
142a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                CR v = CR.valueOf(i);
143a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                checkApprEq(
144a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                    x.ln().add(v.ln()),
145a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                    x.multiply(v).ln(),
146a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                    "ln(product) formula failed for:" + xAsDouble + "," + i);
147a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            }
148a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
149a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    }
150a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
151a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    private static void checkBasic(CR x) {
152a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(x.abs().sqrt().multiply(x.abs().sqrt()), x.abs(),
153a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                    "sqrt*sqrt:" + x.doubleValue());
154a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        if (!x.get_appr(TEST_PREC).equals(BigInteger.ZERO)) {
155a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkApprEq(x.inverse().inverse(), x,
156a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                        "inverse(inverse):" + x.doubleValue());
157a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
158a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    }
159a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
160a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    public void testSlowTrig() {
161a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(ACOS.execute(ZERO), CR.PI.divide(TWO), "acos(0)");
162a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(ACOS.execute(ONE), ZERO, "acos(1)");
163a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(ACOS.execute(ONE.negate()), CR.PI, "acos(-1)");
164a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(ASIN.execute(ZERO), ZERO, "asin(0)");
165a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(ASIN.execute(ONE), CR.PI.divide(TWO), "asin(1)");
166a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(ASIN.execute(ONE.negate()),
167a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm                                 CR.PI.divide(TWO).negate(), "asin(-1)");
168a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkTrig(ZERO);
169a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        CR BIG = CR.valueOf(200).exp();
170a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkTrig(BIG);
171a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkTrig(BIG.negate());
172a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkTrig(SMALL);
173a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkTrig(SMALL.negate());
174a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkTrig(CR.PI);
175a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkTrig(CR.PI.subtract(SMALL));
176a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkTrig(CR.PI.add(SMALL));
177a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkTrig(CR.PI.negate());
178a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkTrig(CR.PI.negate().subtract(SMALL));
179a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkTrig(CR.PI.negate().add(SMALL));
180a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        Random r = new Random();  // Random seed!
181a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        for (int i = 0; i < NRANDOM; ++i) {
182a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            double d = Math.exp(2.0 * r.nextDouble() - 1.0);
183a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            if (r.nextBoolean()) d = -d;
184a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            final CR x = CR.valueOf(d);
185a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkTrig(x);
186a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
187a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        // And a few big ones
188a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        for (int i = 0; i < 10; ++i) {
189a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            double d = Math.exp(200.0 * r.nextDouble());
190a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            if (r.nextBoolean()) d = -d;
191a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            final CR x = CR.valueOf(d);
192a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkTrig(x);
193a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
194a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    }
195a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
196a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    public void testSlowExpLn() {
197a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(CR.valueOf(1).ln(), CR.valueOf(0), "ln(1) != 0");
198a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkExpLn(CR.valueOf(0));
199a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        CR BIG = CR.valueOf(200).exp();
200a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkExpLn(BIG);
201a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkExpLn(BIG.negate());
202a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkExpLn(SMALL);
203a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkExpLn(SMALL.negate());
204a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkExpLn(CR.PI);
205a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkExpLn(ONE);
206a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkExpLn(ONE.subtract(SMALL));
207a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkExpLn(ONE.negate().subtract(SMALL));
208a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        Random r = new Random();  // Random seed!
209a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        for (int i = 0; i < NRANDOM; ++i) {
210a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            double d = Math.exp(10.0 * r.nextDouble() - 1.0);
211a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            if (r.nextBoolean()) d = -d;
212a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            final CR x = CR.valueOf(d);
213a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkExpLn(x);
214a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
215a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        // And a few big ones
216a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        for (int i = 0; i < 10; ++i) {
217a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            double d = Math.exp(200.0 * r.nextDouble());
218a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            if (r.nextBoolean()) d = -d;
219a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            final CR x = CR.valueOf(d);
220a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkExpLn(x);
221a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
222a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    }
223a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm
224a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    public void testSlowBasic() {
225a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(ZERO.sqrt(), ZERO, "sqrt(0)");
226a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        checkApprEq(ZERO.abs(), ZERO, "abs(0)");
227a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        Random r = new Random();  // Random seed!
228a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        for (int i = 0; i < NRANDOM; ++i) {
229a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            double d = Math.exp(10.0 * r.nextDouble() - 1.0);
230a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            if (r.nextBoolean()) d = -d;
231a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            final CR x = CR.valueOf(d);
232a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkBasic(x);
233a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
234a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        // And a few very big ones, but within IEEE double range
235a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        for (int i = 0; i < 10; ++i) {
236a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            double d = Math.exp(600.0 * r.nextDouble());
237a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            if (r.nextBoolean()) d = -d;
238a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            final CR x = CR.valueOf(d);
239a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm            checkBasic(x);
240a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm        }
241a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm    }
242a8e45a3255089266ccf6500188a2d31af8634e4aHans Boehm}
243